{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 工业质检介绍\n",
    "\n",
    "产品质量不稳定的问题一直困扰着我国许多传统制造业企业，而传统的质量管理手段如六西格玛等，实际执行时需要大量的人力资源、管理资源投入进行保障，并且，只是降低问题发生的概率，并不能够完全杜绝质量问题发生。近年来，随着我国人力资源成本逐年升高，以及国内外宏观环境的影响，传统制造企业面临的转型升级压力越来越大。\n",
    "\n",
    "随着人工智能和计算机视觉等技术突飞猛进，诞生了工业质检的应用场景，如果能够将这些技术应用于各行各业，尤其是半导体、纺织、快速消费品等质量要求严格或劳动强度大的行业，将创造巨大的商业价值。\n",
    "\n",
    "本文聚焦于纺织行业的布匹疵点智能检测场景，使用PaddleDetection中CascadeRCNN和YOLOv3的增强模型进行训练、预测，大幅提升预测速度，并提供了多种模型部署方式，使模型具备在工业场景的落地能力，以期为各种工业质检场景提供解决方案示例。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 关于本项目\n",
    "\n",
    "> 针对项目还存在的改进空间，以及模型的落地部署实现，希望大家多交流观点、介绍经验，共同学习进步。[个人主页](https://aistudio.baidu.com/aistudio/personalcenter/thirdview/90149)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 数据集介绍\n",
    "[2019广东工业智造创新大赛【赛场一】](https://tianchi.aliyun.com/competition/entrance/231748/information)初赛数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!unzip data/data11768/guangdong1_round1_train1_20190818.zip -d data/\n",
    "!unzip data/data11768/guangdong1_round1_testA_20190818.zip -d data/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 文件夹目录结构\n",
    "\n",
    "a) 文件夹结构：\n",
    "- defect Images\n",
    "- normal Images\n",
    "- Annotations\n",
    "- README.md\n",
    "\n",
    "b) defect Images : 存放有瑕疵的图像数据，normal Images存放无疵点的图像数据，jpeg编码图像文件。\n",
    "\n",
    "c) Annotations : 存放属性标签标注数据。\n",
    "\n",
    "d) README.md：对数据的详细介绍。\n",
    "\n",
    "## 标注格式说明\n",
    "\n",
    "训练集的标注文件在Annotations文件下的json文件中，数据标注格式如下：\n",
    "\n",
    "```\n",
    "[\n",
    "    {\n",
    "        \"name\": \"454343f838a44f1a0933117242.jpg\",\n",
    "        \"defect_name\": \"\\u65ad\\u6c28\\u7eb6\",\n",
    "        \"bbox\": [\n",
    "            2347.4,\n",
    "            194.92,\n",
    "            2364.01,\n",
    "            229.81\n",
    "        ]\n",
    "    },\n",
    "    {\n",
    "        \"name\": \"454343f838a44f1a0933117242.jpg\",\n",
    "        \"defect_name\": \"\\u65ad\\u6c28\\u7eb6\",\n",
    "        \"bbox\": [\n",
    "            1646.51,\n",
    "            598.38,\n",
    "            1672.07,\n",
    "            623.94\n",
    "        ]\n",
    "    },\n",
    "    ... ...\n",
    "    ,\n",
    "        {\n",
    "        \"name\": \"6cd07cf38d7b71371204456502.jpg\",\n",
    "        \"defect_name\": \"\\u4e09\\u4e1d\",\n",
    "        \"bbox\": [\n",
    "            2258.05,\n",
    "            105.49,\n",
    "            2274.48,\n",
    "            169.38\n",
    "        ]\n",
    "    }\n",
    "]\n",
    "```\n",
    "\n",
    "#### 格式说明\n",
    "\n",
    "1.json文件中包含多个疵点样本，每个疵点样本都包含name、defect_name、bbox三个字段。\n",
    "\n",
    "2.name字段为训练图片的文件名；defect_name字段为该疵点详细的疵点名称；bbox为xyxy格式坐标框；\n",
    "\n",
    "3.对于存在多个疵点的图片，在标注文件中依次列出了每个疵点样本；\n",
    "\n",
    "4.normal Images中的图片无疵点图片，没有在标注文件中出现。\n",
    "\n",
    "5.defect_name字段中的疵点名称，是疵点的**中文名称**，编码格式为unicode。与要求提交结果文件中的category字段的映射关系如下。\n",
    "\n",
    "## 疵点名称对应的category id\n",
    "\n",
    "| 类别名      | 无疵点 | 破洞 | 水渍 | 油渍 | 污渍 | 三丝 | 结头 | 花板跳 | 百脚 | 毛粒 |\n",
    "| ----------- | ------ | ---- | ---- | ---- | ---- | ---- | ---- | ------ | ---- | ---- |\n",
    "| category id | 0      | 1    | 2    | 2    | 2    | 3    | 4    | 5      | 6    | 7    |\n",
    "\n",
    "| 类别名      | 粗经 | 松经 | 断经 | 吊经 | 粗维 | 纬缩 | 浆斑 | 整经结 | 星跳 | 跳花 |\n",
    "| ----------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ------ | ---- | ---- |\n",
    "| category id | 8    | 9    | 10   | 11   | 12   | 13   | 14   | 15     | 16   | 16   |\n",
    "\n",
    "| 类别名      | 断氨纶 | 稀密档 | 浪纹档 | 色差档 | 磨痕 | 轧痕 | 修痕 | 烧毛痕 | 死皱 | 云织 |\n",
    "| ----------- | ------ | ------ | ------ | ------ | ---- | ---- | ---- | ------ | ---- | ---- |\n",
    "| category id | 17     | 18     | 18     | 18     | 19   | 19   | 19   | 19     | 20   | 20   |\n",
    "\n",
    "| 类别名      | 双纬 | 双经 | 跳纱 | 筘路 | 纬纱不良 |      |      |      |      |      |\n",
    "| ----------- | ---- | ---- | ---- | ---- | -------- | ---- | ---- | ---- | ---- | ---- |\n",
    "| category id | 20   | 20   | 20   | 20   | 20       |      |      |      |      |      |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 拉取模型库"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## PaddleClas模型库\n",
    "主要是做抠图分类用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cloning into 'PaddleClas'...\n",
      "remote: Enumerating objects: 3418, done.\u001b[K\n",
      "remote: Counting objects: 100% (3418/3418), done.\u001b[K\n",
      "remote: Compressing objects: 100% (1571/1571), done.\u001b[K\n",
      "remote: Total 3418 (delta 2185), reused 2846 (delta 1786), pack-reused 0\u001b[K\n",
      "Receiving objects: 100% (3418/3418), 25.25 MiB | 2.94 MiB/s, done.\n",
      "Resolving deltas: 100% (2185/2185), done.\n",
      "Checking connectivity... done.\n"
     ]
    }
   ],
   "source": [
    "!git clone https://gitee.com/paddlepaddle/PaddleClas.git"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting ujson (from -r PaddleClas/requirements.txt (line 1))\n",
      "\u001b[33m  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError(\"HTTPSConnectionPool(host='pypi.mirrors.ustc.edu.cn', port=443): Read timed out. (read timeout=15)\")': /simple/ujson/\u001b[0m\n",
      "\u001b[33m  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError(\"HTTPSConnectionPool(host='mirrors.ustc.edu.cn', port=443): Read timed out. (read timeout=15)\")': /pypi/web/simple/ujson/\u001b[0m\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/82/f2/12ca7bfd7879f8ed1b53104f2a6751a7722d63b12951c91c61ff433e5170/ujson-3.0.0-cp37-cp37m-manylinux1_x86_64.whl (176kB)\n",
      "\u001b[K     |████████████████████████████████| 184kB 10.4MB/s eta 0:00:01\n",
      "\u001b[?25hRequirement already satisfied: opencv-python in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleClas/requirements.txt (line 2)) (4.1.1.26)\n",
      "Requirement already satisfied: pillow in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleClas/requirements.txt (line 3)) (6.2.0)\n",
      "Requirement already satisfied: tqdm in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleClas/requirements.txt (line 4)) (4.36.1)\n",
      "Requirement already satisfied: PyYAML in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleClas/requirements.txt (line 5)) (5.1.2)\n",
      "Collecting visualdl>=2.0.0b (from -r PaddleClas/requirements.txt (line 6))\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/1e/1e/d92ce71705b0de5e5fde210fc7369ee9a1aa6a53065a83c968b655885b9a/visualdl-2.0.0b6-py3-none-any.whl (2.9MB)\n",
      "\u001b[K     |████████████████████████████████| 2.9MB 49.1MB/s eta 0:00:01\n",
      "\u001b[?25hRequirement already satisfied: numpy>=1.14.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from opencv-python->-r PaddleClas/requirements.txt (line 2)) (1.16.4)\n",
      "Requirement already satisfied: requests in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2.22.0)\n",
      "Collecting six>=1.14.0 (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6))\n",
      "  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl\n",
      "Collecting Flask-Babel>=1.0.0 (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6))\n",
      "  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/76/a4/0115c7c520125853037fc1d6b3da132a526949640e27a699a13e05ec7593/Flask_Babel-1.0.0-py3-none-any.whl\n",
      "Requirement already satisfied: pre-commit in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.21.0)\n",
      "Requirement already satisfied: protobuf>=3.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (3.10.0)\n",
      "Collecting hdfs (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6))\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/82/39/2c0879b1bcfd1f6ad078eb210d09dbce21072386a3997074ee91e60ddc5a/hdfs-2.5.8.tar.gz (41kB)\n",
      "\u001b[K     |████████████████████████████████| 51kB 30.4MB/s eta 0:00:01\n",
      "\u001b[?25hRequirement already satisfied: flask>=1.1.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.1.1)\n",
      "Requirement already satisfied: flake8>=3.7.9 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (3.7.9)\n",
      "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (3.0.4)\n",
      "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.25.6)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2019.9.11)\n",
      "Requirement already satisfied: idna<2.9,>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2.8)\n",
      "Requirement already satisfied: pytz in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Flask-Babel>=1.0.0->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2019.3)\n",
      "Requirement already satisfied: Jinja2>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Flask-Babel>=1.0.0->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2.10.1)\n",
      "Collecting Babel>=2.3 (from Flask-Babel>=1.0.0->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6))\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/15/a1/522dccd23e5d2e47aed4b6a16795b8213e3272c7506e625f2425ad025a19/Babel-2.8.0-py2.py3-none-any.whl (8.6MB)\n",
      "\u001b[K     |████████████████████████████████| 8.6MB 202kB/s eta 0:00:011\n",
      "\u001b[?25hRequirement already satisfied: toml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (0.10.0)\n",
      "Requirement already satisfied: identify>=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.4.10)\n",
      "Requirement already satisfied: nodeenv>=0.11.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.3.4)\n",
      "Requirement already satisfied: aspy.yaml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.3.0)\n",
      "Requirement already satisfied: virtualenv>=15.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (16.7.9)\n",
      "Requirement already satisfied: cfgv>=2.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2.0.1)\n",
      "Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (0.23)\n",
      "Requirement already satisfied: setuptools in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from protobuf>=3.1.0->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (41.4.0)\n",
      "Collecting docopt (from hdfs->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6))\n",
      "  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz\n",
      "Requirement already satisfied: itsdangerous>=0.24 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.1.0)\n",
      "Requirement already satisfied: click>=5.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (7.0)\n",
      "Requirement already satisfied: Werkzeug>=0.15 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (0.16.0)\n",
      "Requirement already satisfied: entrypoints<0.4.0,>=0.3.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (0.3)\n",
      "Requirement already satisfied: mccabe<0.7.0,>=0.6.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (0.6.1)\n",
      "Requirement already satisfied: pyflakes<2.2.0,>=2.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2.1.1)\n",
      "Requirement already satisfied: pycodestyle<2.6.0,>=2.5.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8>=3.7.9->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (2.5.0)\n",
      "Requirement already satisfied: MarkupSafe>=0.23 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Jinja2>=2.5->Flask-Babel>=1.0.0->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (1.1.1)\n",
      "Requirement already satisfied: zipp>=0.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from importlib-metadata; python_version < \"3.8\"->pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (0.6.0)\n",
      "Requirement already satisfied: more-itertools in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from zipp>=0.5->importlib-metadata; python_version < \"3.8\"->pre-commit->visualdl>=2.0.0b->-r PaddleClas/requirements.txt (line 6)) (7.2.0)\n",
      "Building wheels for collected packages: hdfs, docopt\n",
      "  Building wheel for hdfs (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for hdfs: filename=hdfs-2.5.8-cp37-none-any.whl size=33214 sha256=efbe265292cf79642b6de5f545ec8ba52ff191fa982b6866f140c6e2ab464e6d\n",
      "  Stored in directory: /home/aistudio/.cache/pip/wheels/35/91/05/ed325f80520cc72b4eaa7327f96358c62d84afd098625ed2bd\n",
      "  Building wheel for docopt (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for docopt: filename=docopt-0.6.2-py2.py3-none-any.whl size=13704 sha256=0033dd6515f189b4c154ead002146d68f11c729561f040c45bf3a2317638182e\n",
      "  Stored in directory: /home/aistudio/.cache/pip/wheels/78/da/5a/be54433e626178926da00dbc53e06294ba87ec2c37dded83b4\n",
      "Successfully built hdfs docopt\n",
      "\u001b[31mERROR: visualdl 2.0.0b6 has requirement Pillow>=7.0.0, but you'll have pillow 6.2.0 which is incompatible.\u001b[0m\n",
      "Installing collected packages: ujson, six, Babel, Flask-Babel, docopt, hdfs, visualdl\n",
      "  Found existing installation: six 1.12.0\n",
      "    Uninstalling six-1.12.0:\n",
      "      Successfully uninstalled six-1.12.0\n",
      "  Found existing installation: visualdl 1.3.0\n",
      "    Uninstalling visualdl-1.3.0:\n",
      "      Successfully uninstalled visualdl-1.3.0\n",
      "Successfully installed Babel-2.8.0 Flask-Babel-1.0.0 docopt-0.6.2 hdfs-2.5.8 six-1.15.0 ujson-3.0.0 visualdl-2.0.0b6\n"
     ]
    }
   ],
   "source": [
    "!pip install -r PaddleClas/requirements.txt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## PaddleDetection模型库\n",
    "因为主分支YOLO模型要求PaddlePaddle框架是2.0，所以这里不仅拉取主分支，也拉取旧的release/0.2分支"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# %cd work\n",
    "# !git clone https://gitee.com/paddlepaddle/PaddleDetection.git\n",
    "# %cd ..\n",
    "# !git clone -b release/0.2 https://gitee.com/paddlepaddle/PaddleDetection.git"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 安装cocoAPI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# install pycocotools to the Python site-packages\n",
      "python setup.py build_ext install\n",
      "running build_ext\n",
      "skipping 'pycocotools/_mask.c' Cython extension (up-to-date)\n",
      "building 'pycocotools._mask' extension\n",
      "creating build\n",
      "creating build/common\n",
      "creating build/temp.linux-x86_64-3.7\n",
      "creating build/temp.linux-x86_64-3.7/pycocotools\n",
      "gcc -pthread -B /opt/conda/envs/python35-paddle120-env/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/numpy/core/include -I../common -I/opt/conda/envs/python35-paddle120-env/include/python3.7m -c ../common/maskApi.c -o build/temp.linux-x86_64-3.7/../common/maskApi.o -Wno-cpp -Wno-unused-function -std=c99\n",
      "\u001b[01m\u001b[K../common/maskApi.c:\u001b[m\u001b[K In function ‘\u001b[01m\u001b[KrleToBbox\u001b[m\u001b[K’:\n",
      "\u001b[01m\u001b[K../common/maskApi.c:141:31:\u001b[m\u001b[K \u001b[01;35m\u001b[Kwarning: \u001b[m\u001b[K‘\u001b[01m\u001b[Kxp\u001b[m\u001b[K’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n",
      "       if(j%2==0) xp=x; else if(xp<x) { ys=0; ye=h-1; }\n",
      "\u001b[01;32m\u001b[K                               ^\u001b[m\u001b[K\n",
      "gcc -pthread -B /opt/conda/envs/python35-paddle120-env/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/numpy/core/include -I../common -I/opt/conda/envs/python35-paddle120-env/include/python3.7m -c pycocotools/_mask.c -o build/temp.linux-x86_64-3.7/pycocotools/_mask.o -Wno-cpp -Wno-unused-function -std=c99\n",
      "creating build/lib.linux-x86_64-3.7\n",
      "creating build/lib.linux-x86_64-3.7/pycocotools\n",
      "gcc -pthread -shared -B /opt/conda/envs/python35-paddle120-env/compiler_compat -L/opt/conda/envs/python35-paddle120-env/lib -Wl,-rpath=/opt/conda/envs/python35-paddle120-env/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.7/../common/maskApi.o build/temp.linux-x86_64-3.7/pycocotools/_mask.o -o build/lib.linux-x86_64-3.7/pycocotools/_mask.cpython-37m-x86_64-linux-gnu.so\n",
      "running install\n",
      "running bdist_egg\n",
      "running egg_info\n",
      "writing pycocotools.egg-info/PKG-INFO\n",
      "writing dependency_links to pycocotools.egg-info/dependency_links.txt\n",
      "writing requirements to pycocotools.egg-info/requires.txt\n",
      "writing top-level names to pycocotools.egg-info/top_level.txt\n",
      "reading manifest file 'pycocotools.egg-info/SOURCES.txt'\n",
      "writing manifest file 'pycocotools.egg-info/SOURCES.txt'\n",
      "installing library code to build/bdist.linux-x86_64/egg\n",
      "running install_lib\n",
      "running build_py\n",
      "copying pycocotools/coco.py -> build/lib.linux-x86_64-3.7/pycocotools\n",
      "copying pycocotools/__init__.py -> build/lib.linux-x86_64-3.7/pycocotools\n",
      "copying pycocotools/cocoeval.py -> build/lib.linux-x86_64-3.7/pycocotools\n",
      "copying pycocotools/mask.py -> build/lib.linux-x86_64-3.7/pycocotools\n",
      "creating build/bdist.linux-x86_64\n",
      "creating build/bdist.linux-x86_64/egg\n",
      "creating build/bdist.linux-x86_64/egg/pycocotools\n",
      "copying build/lib.linux-x86_64-3.7/pycocotools/coco.py -> build/bdist.linux-x86_64/egg/pycocotools\n",
      "copying build/lib.linux-x86_64-3.7/pycocotools/_mask.cpython-37m-x86_64-linux-gnu.so -> build/bdist.linux-x86_64/egg/pycocotools\n",
      "copying build/lib.linux-x86_64-3.7/pycocotools/__init__.py -> build/bdist.linux-x86_64/egg/pycocotools\n",
      "copying build/lib.linux-x86_64-3.7/pycocotools/cocoeval.py -> build/bdist.linux-x86_64/egg/pycocotools\n",
      "copying build/lib.linux-x86_64-3.7/pycocotools/mask.py -> build/bdist.linux-x86_64/egg/pycocotools\n",
      "byte-compiling build/bdist.linux-x86_64/egg/pycocotools/coco.py to coco.cpython-37.pyc\n",
      "byte-compiling build/bdist.linux-x86_64/egg/pycocotools/__init__.py to __init__.cpython-37.pyc\n",
      "byte-compiling build/bdist.linux-x86_64/egg/pycocotools/cocoeval.py to cocoeval.cpython-37.pyc\n",
      "byte-compiling build/bdist.linux-x86_64/egg/pycocotools/mask.py to mask.cpython-37.pyc\n",
      "creating stub loader for pycocotools/_mask.cpython-37m-x86_64-linux-gnu.so\n",
      "byte-compiling build/bdist.linux-x86_64/egg/pycocotools/_mask.py to _mask.cpython-37.pyc\n",
      "creating build/bdist.linux-x86_64/egg/EGG-INFO\n",
      "copying pycocotools.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO\n",
      "copying pycocotools.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO\n",
      "copying pycocotools.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO\n",
      "copying pycocotools.egg-info/requires.txt -> build/bdist.linux-x86_64/egg/EGG-INFO\n",
      "copying pycocotools.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO\n",
      "writing build/bdist.linux-x86_64/egg/EGG-INFO/native_libs.txt\n",
      "zip_safe flag not set; analyzing archive contents...\n",
      "pycocotools.__pycache__._mask.cpython-37: module references __file__\n",
      "creating 'dist/pycocotools-2.0-py3.7-linux-x86_64.egg' and adding 'build/bdist.linux-x86_64/egg' to it\n",
      "removing 'build/bdist.linux-x86_64/egg' (and everything under it)\n",
      "Processing pycocotools-2.0-py3.7-linux-x86_64.egg\n",
      "creating /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/pycocotools-2.0-py3.7-linux-x86_64.egg\n",
      "Extracting pycocotools-2.0-py3.7-linux-x86_64.egg to /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Adding pycocotools 2.0 to easy-install.pth file\n",
      "\n",
      "Installed /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/pycocotools-2.0-py3.7-linux-x86_64.egg\n",
      "Processing dependencies for pycocotools==2.0\n",
      "Searching for matplotlib==2.2.3\n",
      "Best match: matplotlib 2.2.3\n",
      "Adding matplotlib 2.2.3 to easy-install.pth file\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for Cython==0.29\n",
      "Best match: Cython 0.29\n",
      "Adding Cython 0.29 to easy-install.pth file\n",
      "Installing cygdb script to /opt/conda/envs/python35-paddle120-env/bin\n",
      "Installing cython script to /opt/conda/envs/python35-paddle120-env/bin\n",
      "Installing cythonize script to /opt/conda/envs/python35-paddle120-env/bin\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for setuptools==41.4.0\n",
      "Best match: setuptools 41.4.0\n",
      "Adding setuptools 41.4.0 to easy-install.pth file\n",
      "Installing easy_install script to /opt/conda/envs/python35-paddle120-env/bin\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for pyparsing==2.4.2\n",
      "Best match: pyparsing 2.4.2\n",
      "Adding pyparsing 2.4.2 to easy-install.pth file\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for numpy==1.16.4\n",
      "Best match: numpy 1.16.4\n",
      "Adding numpy 1.16.4 to easy-install.pth file\n",
      "Installing f2py script to /opt/conda/envs/python35-paddle120-env/bin\n",
      "Installing f2py3 script to /opt/conda/envs/python35-paddle120-env/bin\n",
      "Installing f2py3.7 script to /opt/conda/envs/python35-paddle120-env/bin\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for pytz==2019.3\n",
      "Best match: pytz 2019.3\n",
      "Adding pytz 2019.3 to easy-install.pth file\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for python-dateutil==2.8.0\n",
      "Best match: python-dateutil 2.8.0\n",
      "Adding python-dateutil 2.8.0 to easy-install.pth file\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for six==1.15.0\n",
      "Best match: six 1.15.0\n",
      "Adding six 1.15.0 to easy-install.pth file\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for kiwisolver==1.1.0\n",
      "Best match: kiwisolver 1.1.0\n",
      "Adding kiwisolver 1.1.0 to easy-install.pth file\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Searching for cycler==0.10.0\n",
      "Best match: cycler 0.10.0\n",
      "Adding cycler 0.10.0 to easy-install.pth file\n",
      "\n",
      "Using /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages\n",
      "Finished processing dependencies for pycocotools==2.0\n",
      "rm -rf build\n"
     ]
    }
   ],
   "source": [
    "# 安装cocoAPI\r\n",
    "!git clone https://gitee.com/tigerrouen/cocoapi.git\r\n",
    "#if cython is not installed\r\n",
    "#Install into global site-packages\r\n",
    "!cd cocoapi/PythonAPI && make install\r\n",
    "# Alternatively, if you do not have permissions or prefer\r\n",
    "# not to install the COCO API into global site-packages\r\n",
    "# !python cocoapi/PythonAPI/setup.py install --user"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Requirement already satisfied: tqdm in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleDetection/requirements.txt (line 1)) (4.36.1)\n",
      "Collecting docstring_parser@ http://github.com/willthefrog/docstring_parser/tarball/master from http://github.com/willthefrog/docstring_parser/tarball/master (from -r PaddleDetection/requirements.txt (line 2))\n",
      "\u001b[?25l  Downloading http://github.com/willthefrog/docstring_parser/tarball/master\n",
      "\u001b[K     \\ 20kB 28kB/ss\n",
      "\u001b[?25h  Installing build dependencies ... \u001b[?25ldone\n",
      "\u001b[?25h  Getting requirements to build wheel ... \u001b[?25ldone\n",
      "\u001b[?25h    Preparing wheel metadata ... \u001b[?25ldone\n",
      "\u001b[?25hCollecting typeguard (from -r PaddleDetection/requirements.txt (line 3))\n",
      "  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/52/33/3755584541a18d954389447bfd5f9cb7fa20dfbf5094829aee4a103e580c/typeguard-2.9.1-py3-none-any.whl\n",
      "Requirement already satisfied: tb-paddle in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleDetection/requirements.txt (line 4)) (0.3.6)\n",
      "Requirement already satisfied: tensorboard>=1.15 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleDetection/requirements.txt (line 5)) (2.1.0)\n",
      "Requirement already satisfied: cython in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r PaddleDetection/requirements.txt (line 6)) (0.29)\n",
      "Requirement already satisfied: pycocotools in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/pycocotools-2.0-py3.7-linux-x86_64.egg (from -r PaddleDetection/requirements.txt (line 7)) (2.0)\n",
      "Requirement already satisfied: pillow in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (6.2.0)\n",
      "Requirement already satisfied: protobuf>=3.6.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (3.10.0)\n",
      "Requirement already satisfied: moviepy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (1.0.1)\n",
      "Requirement already satisfied: six in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (1.15.0)\n",
      "Requirement already satisfied: numpy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (1.16.4)\n",
      "Requirement already satisfied: grpcio>=1.24.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (1.26.0)\n",
      "Requirement already satisfied: google-auth<2,>=1.6.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (1.10.0)\n",
      "Requirement already satisfied: requests<3,>=2.21.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (2.22.0)\n",
      "Requirement already satisfied: werkzeug>=0.11.15 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (0.16.0)\n",
      "Requirement already satisfied: absl-py>=0.4 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (0.8.1)\n",
      "Requirement already satisfied: markdown>=2.6.8 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (3.1.1)\n",
      "Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (0.33.6)\n",
      "Requirement already satisfied: setuptools>=41.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (41.4.0)\n",
      "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (0.4.1)\n",
      "Requirement already satisfied: matplotlib>=2.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pycocotools->-r PaddleDetection/requirements.txt (line 7)) (2.2.3)\n",
      "Requirement already satisfied: imageio<3.0,>=2.5; python_version >= \"3.4\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (2.6.1)\n",
      "Requirement already satisfied: proglog<=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (0.1.9)\n",
      "Requirement already satisfied: imageio-ffmpeg>=0.2.0; python_version >= \"3.4\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (0.3.0)\n",
      "Requirement already satisfied: decorator<5.0,>=4.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->-r PaddleDetection/requirements.txt (line 4)) (4.4.0)\n",
      "Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (0.2.7)\n",
      "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (4.0.0)\n",
      "Requirement already satisfied: rsa<4.1,>=3.1.4 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (4.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (2019.9.11)\n",
      "Requirement already satisfied: idna<2.9,>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (2.8)\n",
      "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (1.25.6)\n",
      "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3,>=2.21.0->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (3.0.4)\n",
      "Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (1.3.0)\n",
      "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib>=2.1.0->pycocotools->-r PaddleDetection/requirements.txt (line 7)) (2.8.0)\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib>=2.1.0->pycocotools->-r PaddleDetection/requirements.txt (line 7)) (1.1.0)\n",
      "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib>=2.1.0->pycocotools->-r PaddleDetection/requirements.txt (line 7)) (2.4.2)\n",
      "Requirement already satisfied: cycler>=0.10 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib>=2.1.0->pycocotools->-r PaddleDetection/requirements.txt (line 7)) (0.10.0)\n",
      "Requirement already satisfied: pytz in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib>=2.1.0->pycocotools->-r PaddleDetection/requirements.txt (line 7)) (2019.3)\n",
      "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (0.4.8)\n",
      "Requirement already satisfied: oauthlib>=3.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=1.15->-r PaddleDetection/requirements.txt (line 5)) (3.1.0)\n",
      "Building wheels for collected packages: docstring-parser\n",
      "  Building wheel for docstring-parser (PEP 517) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for docstring-parser: filename=docstring_parser-0.3-cp37-none-any.whl size=10439 sha256=c82774206595728c1aab598ecbe33d44c26eb9d6a9d69fc5eff86a9cc13ab73e\n",
      "  Stored in directory: /tmp/pip-ephem-wheel-cache-zo7764xs/wheels/49/9d/43/6afaa63d882e3d54f95a171a042e0fdd2f045c824898c4034c\n",
      "Successfully built docstring-parser\n",
      "Installing collected packages: docstring-parser, typeguard\n",
      "Successfully installed docstring-parser-0.3 typeguard-2.9.1\n"
     ]
    }
   ],
   "source": [
    "!pip install -r PaddleDetection/requirements.txt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting kmeans\n",
      "  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/d1/7e/87d12a99d7ccfd2c85b19899012177e1718c2d6c0148fad421523160e84b/kmeans-1.0.2.tar.gz\n",
      "Building wheels for collected packages: kmeans\n",
      "  Building wheel for kmeans (setup.py) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for kmeans: filename=kmeans-1.0.2-cp37-cp37m-linux_x86_64.whl size=12018 sha256=5a978d567a81d9ffff69d815476fa0dce279f442f9da2864a45811228cd46768\n",
      "  Stored in directory: /home/aistudio/.cache/pip/wheels/d3/bd/96/a294ddb65e9c1d20ef899625ebbd91ecae91c73ccb409b9306\n",
      "Successfully built kmeans\n",
      "Installing collected packages: kmeans\n",
      "Successfully installed kmeans-1.0.2\n"
     ]
    }
   ],
   "source": [
    "!pip install kmeans"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 加载工具库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import json\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.font_manager import FontProperties\n",
    "import os, sys, zipfile\n",
    "import urllib.request\n",
    "import shutil\n",
    "import random\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "import cv2\n",
    "import kmeans"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 数据集准备\n",
    "- 参考竞赛页置顶notebook并稍作修改，手动划分10%的图片作为验证集\n",
    "- [训练集标注文件转换为COCO格式[ 2019广东工业智造创新大赛【赛场一】]](https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12281897.0.0.6ac039a9FjGQVq&postId=71169)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## coco格式转换\n",
    "\n",
    "**将数据集转为飞桨模型库中的coco格式，需要划分验证集**\n",
    "  ```\n",
    "  data/coco/\n",
    "  ├── annotations\n",
    "  │   ├── instances_train2014.json\n",
    "  │   ├── instances_train2017.json\n",
    "  │   ├── instances_val2014.json\n",
    "  │   ├── instances_val2017.json\n",
    "  |   ...\n",
    "  ├── train2017\n",
    "  │   ├── 000000000009.jpg\n",
    "  │   ├── 000000580008.jpg\n",
    "  |   ...\n",
    "  ├── val2017\n",
    "  │   ├── 000000000139.jpg\n",
    "  │   ├── 000000000285.jpg\n",
    "  |   ...\n",
    "  ``` "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "defect_name2label = {\r\n",
    "    '破洞': 1, '水渍': 2, '油渍': 2, '污渍': 2, '三丝': 3, '结头': 4, '花板跳': 5, '百脚': 6, '毛粒': 7,\r\n",
    "    '粗经': 8, '松经': 9, '断经': 10, '吊经': 11, '粗维': 12, '纬缩': 13, '浆斑': 14, '整经结': 15, '星跳': 16, '跳花': 16,\r\n",
    "    '断氨纶': 17, '稀密档': 18, '浪纹档': 18, '色差档': 18, '磨痕': 19, '轧痕': 19, '修痕': 19, '烧毛痕': 19, '死皱': 20, '云织': 20,\r\n",
    "    '双纬': 20, '双经': 20, '跳纱': 20, '筘路': 20, '纬纱不良': 20,\r\n",
    "}\r\n",
    "# defect_name2label = {\r\n",
    "#     '破洞': 1, '水渍': 2, '油渍': 3, '污渍': 4, '三丝': 5, '结头': 6, '花板跳': 7, '百脚': 8, '毛粒': 9,\r\n",
    "#     '粗经': 10, '松经': 11, '断经': 12, '吊经': 13, '粗维': 14, '纬缩': 15, '浆斑': 16, '整经结': 17, '星跳': 18, '跳花': 19,\r\n",
    "#     '断氨纶': 20, '稀密档': 21, '浪纹档': 22, '色差档': 23, '磨痕': 24, '轧痕': 25, '修痕': 26, '烧毛痕': 27, '死皱': 28, '云织': 29,\r\n",
    "#     '双纬': 30, '双经': 31, '跳纱': 32, '筘路': 33, '纬纱不良': 34,\r\n",
    "# }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 创建coco格式训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "class Fabric2COCO:\r\n",
    "\r\n",
    "    def __init__(self,mode=\"train2017\"):\r\n",
    "    # def __init__(self,mode=\"val\"):\r\n",
    "        self.images = []\r\n",
    "        self.annotations = []\r\n",
    "        self.categories = []\r\n",
    "        self.img_id = 0\r\n",
    "        self.ann_id = 0\r\n",
    "        self.mode =mode\r\n",
    "        # if not os.path.exists(\"coco/images/{}\".format(self.mode)):\r\n",
    "        #     os.makedirs(\"coco/images/{}\".format(self.mode))\r\n",
    "        if not os.path.exists(\"PaddleDetection/dataset/coco/{}\".format(self.mode)):\r\n",
    "            os.makedirs(\"PaddleDetection/dataset/coco/{}\".format(self.mode))\r\n",
    "\r\n",
    "    def to_coco(self, anno_file,img_dir):\r\n",
    "        self._init_categories()\r\n",
    "        anno_result= pd.read_json(open(anno_file,\"r\"))\r\n",
    "        anno_result = anno_result.head(int(anno_result['name'].count()*0.9))\r\n",
    "        # anno_result = anno_result.tail(int(anno_result['name'].count()*0.1)+1)        \r\n",
    "        name_list=anno_result[\"name\"].unique()\r\n",
    "        for img_name in name_list:\r\n",
    "            img_anno = anno_result[anno_result[\"name\"] == img_name]\r\n",
    "            bboxs = img_anno[\"bbox\"].tolist()\r\n",
    "            defect_names = img_anno[\"defect_name\"].tolist()\r\n",
    "            assert img_anno[\"name\"].unique()[0] == img_name\r\n",
    "\r\n",
    "            img_path=os.path.join(img_dir,img_name)\r\n",
    "            # img =cv2.imread(img_path)\r\n",
    "            # h,w,c=img.shape\r\n",
    "            h,w=1000,2446\r\n",
    "            self.images.append(self._image(img_path,h, w))\r\n",
    "\r\n",
    "            self._cp_img(img_path)\r\n",
    "\r\n",
    "            for bbox, defect_name in zip(bboxs, defect_names):\r\n",
    "                label= defect_name2label[defect_name]\r\n",
    "                annotation = self._annotation(label, bbox)\r\n",
    "                self.annotations.append(annotation)\r\n",
    "                self.ann_id += 1\r\n",
    "            self.img_id += 1\r\n",
    "        instance = {}\r\n",
    "        instance['info'] = 'fabric defect'\r\n",
    "        instance['license'] = ['none']\r\n",
    "        instance['images'] = self.images\r\n",
    "        instance['annotations'] = self.annotations\r\n",
    "        instance['categories'] = self.categories\r\n",
    "        return instance\r\n",
    "\r\n",
    "    def _init_categories(self):\r\n",
    "        for v in range(1,21):\r\n",
    "            print(v)\r\n",
    "            category = {}\r\n",
    "            category['id'] = v\r\n",
    "            category['name'] = str(v)\r\n",
    "            category['supercategory'] = 'defect_name'\r\n",
    "            self.categories.append(category)\r\n",
    "        # for k, v in defect_name2label.items():\r\n",
    "        #     category = {}\r\n",
    "        #     category['id'] = v\r\n",
    "        #     category['name'] = k\r\n",
    "        #     category['supercategory'] = 'defect_name'\r\n",
    "        #     self.categories.append(category)\r\n",
    "\r\n",
    "    def _image(self, path,h,w):\r\n",
    "        image = {}\r\n",
    "        image['height'] = h\r\n",
    "        image['width'] = w\r\n",
    "        image['id'] = self.img_id\r\n",
    "        image['file_name'] = os.path.basename(path)\r\n",
    "        return image\r\n",
    "\r\n",
    "    def _annotation(self,label,bbox):\r\n",
    "        area=(bbox[2]-bbox[0])*(bbox[3]-bbox[1])\r\n",
    "        points=[[bbox[0],bbox[1]],[bbox[2],bbox[1]],[bbox[2],bbox[3]],[bbox[0],bbox[3]]]\r\n",
    "        annotation = {}\r\n",
    "        annotation['id'] = self.ann_id\r\n",
    "        annotation['image_id'] = self.img_id\r\n",
    "        annotation['category_id'] = label\r\n",
    "        annotation['segmentation'] = [np.asarray(points).flatten().tolist()]\r\n",
    "        annotation['bbox'] = self._get_box(points)\r\n",
    "        annotation['iscrowd'] = 0\r\n",
    "        annotation['area'] = area\r\n",
    "        return annotation\r\n",
    "\r\n",
    "    def _cp_img(self, img_path):\r\n",
    "        shutil.copy(img_path, os.path.join(\"PaddleDetection/dataset/coco/{}\".format(self.mode), os.path.basename(img_path)))\r\n",
    "        # shutil.copy(img_path, os.path.join(\"coco/images/{}\".format(self.mode), os.path.basename(img_path)))\r\n",
    "    def _get_box(self, points):\r\n",
    "        min_x = min_y = np.inf\r\n",
    "        max_x = max_y = 0\r\n",
    "        for x, y in points:\r\n",
    "            min_x = min(min_x, x)\r\n",
    "            min_y = min(min_y, y)\r\n",
    "            max_x = max(max_x, x)\r\n",
    "            max_y = max(max_y, y)\r\n",
    "        '''coco,[x,y,w,h]'''\r\n",
    "        return [min_x, min_y, max_x - min_x, max_y - min_y]\r\n",
    "    def save_coco_json(self, instance, save_path):\r\n",
    "        import json\r\n",
    "        with open(save_path, 'w') as fp:\r\n",
    "            json.dump(instance, fp, indent=1, separators=(',', ': '))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "'''转换有瑕疵的样本为coco格式'''\r\n",
    "img_dir = \"data/guangdong1_round1_train1_20190818/defect_Images\"\r\n",
    "anno_dir=\"data/guangdong1_round1_train1_20190818/Annotations/anno_train.json\"\r\n",
    "fabric2coco = Fabric2COCO()\r\n",
    "train_instance = fabric2coco.to_coco(anno_dir,img_dir)\r\n",
    "if not os.path.exists(\"PaddleDetection/dataset/coco/annotations/\"):\r\n",
    "    os.makedirs(\"PaddleDetection/dataset/coco/annotations/\")\r\n",
    "fabric2coco.save_coco_json(train_instance, \"PaddleDetection/dataset/coco/annotations/\"+'instances_{}.json'.format(\"train2017\"))\r\n",
    "# fabric2coco.save_coco_json(train_instance, \"coco/annotations/\"+'instances_{}.json'.format(\"val\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 创建coco格式验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "class Fabric2COCO:\r\n",
    "\r\n",
    "    def __init__(self,mode=\"val2017\"):\r\n",
    "        self.images = []\r\n",
    "        self.annotations = []\r\n",
    "        self.categories = []\r\n",
    "        self.img_id = 0\r\n",
    "        self.ann_id = 0\r\n",
    "        self.mode =mode\r\n",
    "        # if not os.path.exists(\"coco/images/{}\".format(self.mode)):\r\n",
    "        #     os.makedirs(\"coco/images/{}\".format(self.mode))\r\n",
    "        if not os.path.exists(\"PaddleDetection/dataset/coco/{}\".format(self.mode)):\r\n",
    "            os.makedirs(\"PaddleDetection/dataset/coco/{}\".format(self.mode))\r\n",
    "\r\n",
    "    def to_coco(self, anno_file,img_dir):\r\n",
    "        self._init_categories()\r\n",
    "        anno_result= pd.read_json(open(anno_file,\"r\"))\r\n",
    "        anno_result = anno_result.tail(int(anno_result['name'].count()*0.1)+1)        \r\n",
    "        name_list=anno_result[\"name\"].unique()\r\n",
    "        for img_name in name_list:\r\n",
    "            img_anno = anno_result[anno_result[\"name\"] == img_name]\r\n",
    "            bboxs = img_anno[\"bbox\"].tolist()\r\n",
    "            defect_names = img_anno[\"defect_name\"].tolist()\r\n",
    "            assert img_anno[\"name\"].unique()[0] == img_name\r\n",
    "\r\n",
    "            img_path=os.path.join(img_dir,img_name)\r\n",
    "            # img =cv2.imread(img_path)\r\n",
    "            # h,w,c=img.shape\r\n",
    "            h,w=1000,2446\r\n",
    "            self.images.append(self._image(img_path,h, w))\r\n",
    "\r\n",
    "            self._cp_img(img_path)\r\n",
    "\r\n",
    "            for bbox, defect_name in zip(bboxs, defect_names):\r\n",
    "                label= defect_name2label[defect_name]\r\n",
    "                annotation = self._annotation(label, bbox)\r\n",
    "                self.annotations.append(annotation)\r\n",
    "                self.ann_id += 1\r\n",
    "            self.img_id += 1\r\n",
    "        instance = {}\r\n",
    "        instance['info'] = 'fabric defect'\r\n",
    "        instance['license'] = ['none']\r\n",
    "        instance['images'] = self.images\r\n",
    "        instance['annotations'] = self.annotations\r\n",
    "        instance['categories'] = self.categories\r\n",
    "        return instance\r\n",
    "\r\n",
    "    def _init_categories(self):\r\n",
    "        for v in range(1,21):\r\n",
    "            print(v)\r\n",
    "            category = {}\r\n",
    "            category['id'] = v\r\n",
    "            category['name'] = str(v)\r\n",
    "            category['supercategory'] = 'defect_name'\r\n",
    "            self.categories.append(category)\r\n",
    "        # for k, v in defect_name2label.items():\r\n",
    "        #     category = {}\r\n",
    "        #     category['id'] = v\r\n",
    "        #     category['name'] = k\r\n",
    "        #     category['supercategory'] = 'defect_name'\r\n",
    "        #     self.categories.append(category)\r\n",
    "\r\n",
    "    def _image(self, path,h,w):\r\n",
    "        image = {}\r\n",
    "        image['height'] = h\r\n",
    "        image['width'] = w\r\n",
    "        image['id'] = self.img_id\r\n",
    "        image['file_name'] = os.path.basename(path)\r\n",
    "        return image\r\n",
    "\r\n",
    "    def _annotation(self,label,bbox):\r\n",
    "        area=(bbox[2]-bbox[0])*(bbox[3]-bbox[1])\r\n",
    "        points=[[bbox[0],bbox[1]],[bbox[2],bbox[1]],[bbox[2],bbox[3]],[bbox[0],bbox[3]]]\r\n",
    "        annotation = {}\r\n",
    "        annotation['id'] = self.ann_id\r\n",
    "        annotation['image_id'] = self.img_id\r\n",
    "        annotation['category_id'] = label\r\n",
    "        annotation['segmentation'] = [np.asarray(points).flatten().tolist()]\r\n",
    "        annotation['bbox'] = self._get_box(points)\r\n",
    "        annotation['iscrowd'] = 0\r\n",
    "        annotation['area'] = area\r\n",
    "        return annotation\r\n",
    "\r\n",
    "    def _cp_img(self, img_path):\r\n",
    "        shutil.copy(img_path, os.path.join(\"PaddleDetection/dataset/coco/{}\".format(self.mode), os.path.basename(img_path)))\r\n",
    "        # shutil.copy(img_path, os.path.join(\"coco/images/{}\".format(self.mode), os.path.basename(img_path)))\r\n",
    "    def _get_box(self, points):\r\n",
    "        min_x = min_y = np.inf\r\n",
    "        max_x = max_y = 0\r\n",
    "        for x, y in points:\r\n",
    "            min_x = min(min_x, x)\r\n",
    "            min_y = min(min_y, y)\r\n",
    "            max_x = max(max_x, x)\r\n",
    "            max_y = max(max_y, y)\r\n",
    "        '''coco,[x,y,w,h]'''\r\n",
    "        return [min_x, min_y, max_x - min_x, max_y - min_y]\r\n",
    "    def save_coco_json(self, instance, save_path):\r\n",
    "        import json\r\n",
    "        with open(save_path, 'w') as fp:\r\n",
    "            json.dump(instance, fp, indent=1, separators=(',', ': '))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "'''转换有瑕疵的样本为coco格式'''\r\n",
    "img_dir = \"data/guangdong1_round1_train1_20190818/defect_Images\"\r\n",
    "anno_dir=\"data/guangdong1_round1_train1_20190818/Annotations/anno_train.json\"\r\n",
    "fabric2coco = Fabric2COCO()\r\n",
    "train_instance = fabric2coco.to_coco(anno_dir,img_dir)\r\n",
    "if not os.path.exists(\"PaddleDetection/dataset/coco/annotations/\"):\r\n",
    "    os.makedirs(\"PaddleDetection/dataset/coco/annotations/\")\r\n",
    "fabric2coco.save_coco_json(train_instance, \"PaddleDetection/dataset/coco/annotations/\"+'instances_{}.json'.format(\"val2017\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 整理后最终文件目录格式\n",
    "\n",
    "  ```\n",
    "  ./coco/\n",
    "  ├── annotations\n",
    "  │   ├── instances_train2014.json\n",
    "  │   ├── instances_train2017.json\n",
    "  |   ...\n",
    "  ├── train2017\n",
    "  │   ├── 5cac654fb8e699da1546312852.jpg\n",
    "  │   ├── 14d68415c6f020021536006312.jpg\n",
    "  |   ...\n",
    "  ├── val2017\n",
    "  │   ├── 6cf97c00f1a180120939190444.jpg\n",
    "  │   ├── cb42508af46ed0a50817439434.jpg\n",
    "  |   ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 生成分类训练数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def get_annotations(datadir, mode=\"train\"):\n",
    "    \"\"\"获取瑕疵标注信息\"\"\"\n",
    "    if mode == \"train\":\n",
    "        ann_file = 'instances_train2017.json'\n",
    "    else:\n",
    "        ann_file = 'instances_val2017.json'\n",
    "    with open(os.path.join(datadir, 'annotations', ann_file) ) as f:\n",
    "        json_file = json.load(f)  \n",
    "        records = []\n",
    "        for objs in json_file['annotations']:\n",
    "            # print(objs)\n",
    "            box = []\n",
    "            label = []\n",
    "            bbox = objs['bbox']\n",
    "            # print(bbox)\n",
    "            # print(objs['image_id'])\n",
    "            x1 = int(bbox[0])\n",
    "            y1 = int(bbox[1])\n",
    "            x2 = int(bbox[0] + bbox[2])\n",
    "            y2 = int(bbox[1] + bbox[3])\n",
    "            box.append([x1, y1, x2, y2])\n",
    "            # 这里有个问题，因为分类训练的label是从0开始算的，所以需要将原始值减去1\n",
    "            objs['category_id'] = objs['category_id'] - 1\n",
    "            label.append(objs['category_id'])\n",
    "            for img in json_file['images']:\n",
    "                if img['id'] == objs['image_id']:\n",
    "                    # print(img)\n",
    "                    img_file = img['file_name']\n",
    "                    # 缺陷id是唯一的，保证不会重复\n",
    "                    fid = objs['id']\n",
    "            voc_rec = {\n",
    "                'im_file': img_file,\n",
    "                'im_id': fid,\n",
    "                'gt_class': label,\n",
    "                'gt_bbox': box\n",
    "                }\n",
    "            records.append(voc_rec)\n",
    "            f.close()\n",
    "    return records\n",
    "\n",
    "\n",
    "def generate_data(datadir, save_dir, records, mode=\"train\"):\n",
    "    im_out = []\n",
    "    if mode == \"train\":\n",
    "        images_dir = 'train2017'\n",
    "    else:\n",
    "        images_dir = 'val2017'\n",
    "    for record in tqdm(records):\n",
    "        img = cv2.imread(os.path.join(datadir, images_dir, record[\"im_file\"]))\n",
    "        # img = imageio.imread(os.path.join(datadir, images_dir, record[\"im_file\"]))\n",
    "        ffile = record[\"im_file\"][:-4]\n",
    "        fid = record[\"im_id\"]\n",
    "        box = record[\"gt_bbox\"][0]\n",
    "        fl = record[\"gt_class\"][0]\n",
    "        # print(fl)\n",
    "        # print(box)\n",
    "        # print(img)\n",
    "        # print(box[1])\n",
    "        im = img[box[1]: box[3], box[0]: box[2]]\n",
    "        fname = '{}/{}/{}_{}.jpg'.format(save_dir, mode, str(ffile), str(fid))\n",
    "        cv2.imwrite(fname, im)\n",
    "        outname = '{}/{}_{}.jpg'.format(mode, str(ffile), str(fid))\n",
    "        im_out.append(\"{} {}\".format(outname, fl))\n",
    "\n",
    "    with open(\"{}/{}_list.txt\".format(save_dir,mode), \"w\") as f:\n",
    "        f.write(\"\\n\".join(im_out))\n",
    "        f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%mkdir PaddleClas/dataset/coco\n",
    "%mkdir PaddleClas/dataset/coco/train\n",
    "%mkdir PaddleClas/dataset/coco/val"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 6955/6955 [05:02<00:00, 23.00it/s]\n",
      "100%|██████████| 773/773 [00:33<00:00, 23.13it/s]\n"
     ]
    }
   ],
   "source": [
    "save_dir = \"PaddleClas/dataset/coco\"\n",
    "coco_dir = \"PaddleDetection/dataset/coco\"\n",
    "train_records = get_annotations(coco_dir, \"train\")\n",
    "generate_data(coco_dir, save_dir, train_records, \"train\")\n",
    "val_records = get_annotations(coco_dir, \"val\")\n",
    "generate_data(coco_dir, save_dir, val_records, \"val\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 数据集相关计算"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 计算RGB通道的均值和标准差"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "计算RGB通道的均值和标准差\n",
    "\"\"\"\n",
    "\n",
    "def compute(path):\n",
    "    file_names = os.listdir(path)\n",
    "    per_image_Rmean = []\n",
    "    per_image_Gmean = []\n",
    "    per_image_Bmean = []\n",
    "    per_image_Rstd = []\n",
    "    per_image_Gstd = []\n",
    "    per_image_Bstd = []\n",
    "    for file_name in file_names:\n",
    "        img = cv2.imread(os.path.join(path, file_name), 1)\n",
    "        per_image_Rmean.append(np.mean(img[:, :, 0]))\n",
    "        per_image_Gmean.append(np.mean(img[:, :, 1]))\n",
    "        per_image_Bmean.append(np.mean(img[:, :, 2]))\n",
    "        per_image_Rstd.append(np.std(img[:, :, 0]))\n",
    "        per_image_Gstd.append(np.std(img[:, :, 1]))\n",
    "        per_image_Bstd.append(np.std(img[:, :, 2]))\n",
    "    R_mean = np.mean(per_image_Rmean)/255.0\n",
    "    G_mean = np.mean(per_image_Gmean)/255.0\n",
    "    B_mean = np.mean(per_image_Bmean)/255.0\n",
    "    R_std = np.mean(per_image_Rstd)/255.0\n",
    "    G_std = np.mean(per_image_Gstd)/255.0\n",
    "    B_std = np.mean(per_image_Bstd)/255.0\n",
    "    image_mean = [R_mean, G_mean, B_mean]\n",
    "    image_std = [R_std, G_std, B_std]\n",
    "    return image_mean, image_std"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bboxes train set image_mean and image_std: [0.3915672743651235, 0.3659221073413657, 0.3658356224302539] [0.10842955766145725, 0.11051785458551451, 0.10201107370690816]\n",
      "bboxes validation set image_mean and image_std: [0.4135658375232079, 0.3829071913393303, 0.37904283407977485] [0.11537134120746612, 0.11818519784654734, 0.10920973618578182]\n"
     ]
    }
   ],
   "source": [
    "image_mean, image_std = compute('PaddleClas/dataset/coco/train')\n",
    "print('bboxes train set image_mean and image_std:', image_mean, image_std)\n",
    "# [0.3915672743651235, 0.3659221073413657, 0.3658356224302539] \n",
    "# [0.10842955766145725, 0.11051785458551451, 0.10201107370690816]\n",
    "image_mean, image_std = compute('PaddleClas/dataset/coco/val')\n",
    "print('bboxes validation set image_mean and image_std:', image_mean, image_std)\n",
    "# [0.4135658375232079, 0.3829071913393303, 0.37904283407977485] \n",
    "# [0.11537134120746612, 0.11818519784654734, 0.10920973618578182]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train set image_mean and image_std: [0.37597409304695484, 0.3486304254014788, 0.3536799056211826] [0.1048299549268863, 0.10444091185913326, 0.09987538234260904]\n",
      "validation set image_mean and image_std: [0.3914940814114446, 0.3605475730949753, 0.36263685530651174] [0.11077973580477549, 0.10994100883809227, 0.10480770290045718]\n"
     ]
    }
   ],
   "source": [
    "image_mean, image_std = compute('PaddleDetection/dataset/coco/train2017')\n",
    "print('train set image_mean and image_std:', image_mean, image_std)\n",
    "image_mean, image_std = compute('PaddleDetection/dataset/coco/val2017')\n",
    "print('validation set image_mean and image_std:', image_mean, image_std)\n",
    "# output\n",
    "# train set image_mean and image_std: \n",
    "    #   mean: [0.37597409304695484, 0.3486304254014788, 0.3536799056211826] \n",
    "    #   std: [0.1048299549268863, 0.10444091185913326, 0.09987538234260904]\n",
    "# validation set image_mean and image_std: \n",
    "    #   mean: [0.3914940814114446, 0.3605475730949753, 0.36263685530651174]\n",
    "    #   std: [0.11077973580477549, 0.10994100883809227, 0.10480770290045718]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## Kmeans聚类计算anchor boxes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def iou(box, clusters):\n",
    "    \"\"\"\n",
    "    Calculates the Intersection over Union (IoU) between a box and k clusters.\n",
    "    :param box: tuple or array, shifted to the origin (i. e. width and height)\n",
    "    :param clusters: numpy array of shape (k, 2) where k is the number of clusters\n",
    "    :return: numpy array of shape (k, 0) where k is the number of clusters\n",
    "    \"\"\"\n",
    "    x = np.minimum(clusters[:, 0], box[0])\n",
    "    y = np.minimum(clusters[:, 1], box[1])\n",
    "    if np.count_nonzero(x == 0) > 0 or np.count_nonzero(y == 0) > 0:\n",
    "        raise ValueError(\"Box has no area\")\n",
    " \n",
    "    intersection = x * y\n",
    "    box_area = box[0] * box[1]\n",
    "    cluster_area = clusters[:, 0] * clusters[:, 1]\n",
    " \n",
    "    iou_ = intersection / (box_area + cluster_area - intersection)\n",
    " \n",
    "    return iou_\n",
    " \n",
    " \n",
    "def avg_iou(boxes, clusters):\n",
    "    \"\"\"\n",
    "    Calculates the average Intersection over Union (IoU) between a numpy array of boxes and k clusters.\n",
    "    :param boxes: numpy array of shape (r, 2), where r is the number of rows\n",
    "    :param clusters: numpy array of shape (k, 2) where k is the number of clusters\n",
    "    :return: average IoU as a single float\n",
    "    \"\"\"\n",
    "    return np.mean([np.max(iou(boxes[i], clusters)) for i in range(boxes.shape[0])])\n",
    " \n",
    " \n",
    "def translate_boxes(boxes):\n",
    "    \"\"\"\n",
    "    Translates all the boxes to the origin.\n",
    "    :param boxes: numpy array of shape (r, 4)\n",
    "    :return: numpy array of shape (r, 2)\n",
    "    \"\"\"\n",
    "    new_boxes = boxes.copy()\n",
    "    for row in range(new_boxes.shape[0]):\n",
    "        new_boxes[row][2] = np.abs(new_boxes[row][2] - new_boxes[row][0])\n",
    "        new_boxes[row][3] = np.abs(new_boxes[row][3] - new_boxes[row][1])\n",
    "    return np.delete(new_boxes, [0, 1], axis=1)\n",
    " \n",
    " \n",
    "def kmeans(boxes, k, dist=np.median):\n",
    "    \"\"\"\n",
    "    Calculates k-means clustering with the Intersection over Union (IoU) metric.\n",
    "    :param boxes: numpy array of shape (r, 2), where r is the number of rows\n",
    "    :param k: number of clusters\n",
    "    :param dist: distance function\n",
    "    :return: numpy array of shape (k, 2)\n",
    "    \"\"\"\n",
    "    rows = boxes.shape[0]\n",
    " \n",
    "    distances = np.empty((rows, k))\n",
    "    last_clusters = np.zeros((rows,))\n",
    " \n",
    "    np.random.seed()\n",
    " \n",
    "    # the Forgy method will fail if the whole array contains the same rows\n",
    "    clusters = boxes[np.random.choice(rows, k, replace=False)]\n",
    " \n",
    "    while True:\n",
    "        for row in range(rows):\n",
    "            distances[row] = 1 - iou(boxes[row], clusters)\n",
    " \n",
    "        nearest_clusters = np.argmin(distances, axis=1)\n",
    " \n",
    "        if (last_clusters == nearest_clusters).all():\n",
    "            break\n",
    " \n",
    "        for cluster in range(k):\n",
    "            clusters[cluster] = dist(boxes[nearest_clusters == cluster], axis=0)\n",
    " \n",
    "        last_clusters = nearest_clusters\n",
    " \n",
    "    return clusters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  7.70564186  31.008     ]\n",
      " [ 13.42273099  12.16      ]\n",
      " [570.46606705 141.056     ]\n",
      " [  8.69991823 594.016     ]\n",
      " [ 45.48814391  20.064     ]\n",
      " [  4.22567457  37.696     ]\n",
      " [ 36.0425184  297.312     ]\n",
      " [  5.46852003  94.24      ]\n",
      " [  4.72281276  15.2       ]]\n",
      "Accuracy: 60.76%\n",
      "Boxes:\n",
      " [  7.70564186  13.42273099 570.46606705   8.69991823  45.48814391\n",
      "   4.22567457  36.0425184    5.46852003   4.72281276]-[ 31.008  12.16  141.056 594.016  20.064  37.696 297.312  94.24   15.2  ]\n",
      "Ratios:\n",
      " [0.01, 0.06, 0.11, 0.12, 0.25, 0.31, 1.1, 2.27, 4.04]\n"
     ]
    }
   ],
   "source": [
    "CLUSTERS = 9\n",
    "\n",
    "\n",
    "def load_dataset(path):\n",
    "    dataset = []\n",
    "    with open(os.path.join(path, 'annotations',  'instances_train2017.json')) as f:\n",
    "        json_file = json.load(f) \n",
    "        for item in json_file['images']:            \n",
    "            height = item['height']\n",
    "            width = item['width']\n",
    "            for objs in json_file['annotations']:\n",
    "                if(objs['image_id'] == item['id']):\n",
    "                    bbox = objs['bbox']\n",
    "                    xmin = int(bbox[0]) / width\n",
    "                    ymin = int(bbox[1]) / height\n",
    "                    xmax = int(bbox[0] + bbox[2]) / width\n",
    "                    ymax = int(bbox[1] + bbox[3]) / height\n",
    " \n",
    "                    xmin = np.float64(xmin)\n",
    "                    ymin = np.float64(ymin)\n",
    "                    xmax = np.float64(xmax)\n",
    "                    ymax = np.float64(ymax)\n",
    "                    if xmax == xmin or ymax == ymin:\n",
    "                        print(item['file_name'])\n",
    "                    dataset.append([xmax - xmin, ymax - ymin])\n",
    "        f.close()\n",
    "    return np.array(dataset)\n",
    " \n",
    "\n",
    "#print(__file__)\n",
    "data = load_dataset('PaddleDetection/dataset/coco')\n",
    "\n",
    "out = kmeans(data, k=CLUSTERS)*608\n",
    "#clusters = [[10,13],[16,30],[33,23],[30,61],[62,45],[59,119],[116,90],[156,198],[373,326]]\n",
    "#out= np.array(clusters)/416.0\n",
    "print(out)\n",
    "print(\"Accuracy: {:.2f}%\".format(avg_iou(data, out/608) * 100))\n",
    "print(\"Boxes:\\n {}-{}\".format(out[:, 0], out[:, 1]))\n",
    " \n",
    "ratios = np.around(out[:, 0] / out[:, 1], decimals=2).tolist()\n",
    "print(\"Ratios:\\n {}\".format(sorted(ratios)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "计算结果\n",
    "```python\n",
    "[[  7.70564186  31.008     ]\n",
    " [ 13.42273099  12.16      ]\n",
    " [570.46606705 141.056     ]\n",
    " [  8.69991823 594.016     ]\n",
    " [ 45.48814391  20.064     ]\n",
    " [  4.22567457  37.696     ]\n",
    " [ 36.0425184  297.312     ]\n",
    " [  5.46852003  94.24      ]\n",
    " [  4.72281276  15.2       ]]\n",
    " \n",
    "Accuracy: 60.76%\n",
    "\n",
    "Boxes:\n",
    " [  7.70564186  13.42273099 570.46606705   8.69991823  45.48814391\n",
    "   4.22567457  36.0425184    5.46852003   4.72281276]-[ 31.008  12.16  141.056 594.016  20.064  37.696 297.312  94.24   15.2  ]\n",
    "   \n",
    "Ratios:\n",
    " [0.01, 0.06, 0.11, 0.12, 0.25, 0.31, 1.1, 2.27, 4.04]\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 使用SENet154_vd训练分类模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/aistudio/PaddleClas\n"
     ]
    }
   ],
   "source": [
    "%cd PaddleClas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: CUDA_VISIBLE_DEVICES=0\n",
      "env: FLAGS_fraction_of_gpu_memory_to_use=0.98\n"
     ]
    }
   ],
   "source": [
    "%set_env CUDA_VISIBLE_DEVICES=0\n",
    "%set_env FLAGS_fraction_of_gpu_memory_to_use=0.98"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-15 06:49:29 INFO: Downloading SENet154_vd_pretrained.tar from https://paddle-imagenet-models-name.bj.bcebos.com/SENet154_vd_pretrained.tar\n",
      "100%|██████████| 477670/477670 [00:16<00:00, 29480.93KB/s]\n",
      "2020-06-15 06:49:45 INFO: Decompressing ./pretrained/SENet154_vd_pretrained.tar...\n",
      "2020-06-15 06:49:46 INFO: download ./pretrained/SENet154_vd_pretrained.tar finished \n"
     ]
    }
   ],
   "source": [
    "%run tools/download.py -a SENet154_vd -p ./pretrained -d True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2020-06-17 02:49:28 INFO: END epoch:199 train loss_avg:  1.2510  elapse_sum: 208.269s\r"
     ]
    }
   ],
   "source": [
    "import os \n",
    "os.environ['PYTHONPATH']=\"/home/aistudio/PaddleClas\"\n",
    "!python -m paddle.distributed.launch --selected_gpus=\"0\" tools/train.py -c configs/SENet/SENet154_vd.yaml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----------  Configuration Arguments -----------\n",
      "cluster_node_ips: 127.0.0.1\n",
      "log_dir: None\n",
      "node_ip: 127.0.0.1\n",
      "print_config: True\n",
      "selected_gpus: 0\n",
      "started_port: 6170\n",
      "training_script: tools/eval.py\n",
      "training_script_args: ['-c', './configs/eval.yaml', '-o', 'ARCHITECTURE.name=SENet154_vd', '-o', 'pretrained_model=output/SENet154_vd/100/ppcls']\n",
      "use_paddlecloud: False\n",
      "------------------------------------------------\n",
      "trainers_endpoints: 127.0.0.1:6170 , node_id: 0 , current_node_ip: 127.0.0.1 , num_nodes: 1 , node_ips: ['127.0.0.1'] , nranks: 1\n",
      "2020-06-17 04:09:29 INFO: \n",
      "===========================================================\n",
      "==        PaddleClas is powered by PaddlePaddle !        ==\n",
      "===========================================================\n",
      "==                                                       ==\n",
      "==   For more info please go to the following website.   ==\n",
      "==                                                       ==\n",
      "==       https://github.com/PaddlePaddle/PaddleClas      ==\n",
      "===========================================================\n",
      "\n",
      "2020-06-17 04:09:29 INFO: ARCHITECTURE : \n",
      "2020-06-17 04:09:29 INFO:     name : SENet154_vd\n",
      "2020-06-17 04:09:29 INFO: ------------------------------------------------------------\n",
      "2020-06-17 04:09:29 INFO: VALID : \n",
      "2020-06-17 04:09:29 INFO:     batch_size : 8\n",
      "2020-06-17 04:09:29 INFO:     data_dir : ./dataset/coco/\n",
      "2020-06-17 04:09:29 INFO:     file_list : ./dataset/coco/val_list.txt\n",
      "2020-06-17 04:09:29 INFO:     num_workers : 2\n",
      "2020-06-17 04:09:29 INFO:     shuffle_seed : 0\n",
      "2020-06-17 04:09:29 INFO:     transforms : \n",
      "2020-06-17 04:09:29 INFO:         DecodeImage : \n",
      "2020-06-17 04:09:29 INFO:             channel_first : False\n",
      "2020-06-17 04:09:29 INFO:             to_np : False\n",
      "2020-06-17 04:09:29 INFO:             to_rgb : True\n",
      "2020-06-17 04:09:29 INFO:         ResizeImage : \n",
      "2020-06-17 04:09:29 INFO:             resize_short : 256\n",
      "2020-06-17 04:09:29 INFO:         CropImage : \n",
      "2020-06-17 04:09:29 INFO:             size : 224\n",
      "2020-06-17 04:09:29 INFO:         NormalizeImage : \n",
      "2020-06-17 04:09:29 INFO:             mean : [0.39, 0.37, 0.36]\n",
      "2020-06-17 04:09:29 INFO:             order : \n",
      "2020-06-17 04:09:29 INFO:             scale : 1.0/255.0\n",
      "2020-06-17 04:09:29 INFO:             std : [0.11, 0.11, 0.1]\n",
      "2020-06-17 04:09:29 INFO:         ToCHWImage : None\n",
      "2020-06-17 04:09:29 INFO: ------------------------------------------------------------\n",
      "2020-06-17 04:09:29 INFO: classes_num : 20\n",
      "2020-06-17 04:09:29 INFO: image_shape : [3, 224, 224]\n",
      "2020-06-17 04:09:29 INFO: mode : valid\n",
      "2020-06-17 04:09:29 INFO: pretrained_model : output/SENet154_vd/100/ppcls\n",
      "2020-06-17 04:09:29 INFO: topk : 1\n",
      "2020-06-17 04:09:29 INFO: total_images : 7728\n",
      "W0616 20:09:32.540721 18590 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0\n",
      "W0616 20:09:32.544960 18590 device_context.cc:245] device: 0, cuDNN Version: 7.3.\n",
      "2020-06-17 04:09:34 INFO: Loading parameters from output/SENet154_vd/100/ppcls...\n",
      "2020-06-17 04:09:39 INFO: Finish initing model from ['output/SENet154_vd/100/ppcls']\n",
      "I0616 20:09:39.782160 18590 parallel_executor.cc:440] The Program will be executed on CUDA using ParallelExecutor, 1 cards are used, so 1 programs are executed in parallel.\n",
      "I0616 20:09:39.844017 18590 build_strategy.cc:365] SeqOnlyAllReduceOps:0, num_trainers:1\n",
      "I0616 20:09:39.904100 18590 parallel_executor.cc:307] Inplace strategy is enabled, when build_strategy.enable_inplace = True\n",
      "I0616 20:09:39.934674 18590 parallel_executor.cc:375] Garbage collection strategy is enabled, when FLAGS_eager_delete_tensor_gb = 0\n",
      "2020-06-17 04:09:40 INFO: eval step:0    loss:  0.7798 top1: 0.8750 elapse: 0.647ss\n",
      "2020-06-17 04:09:40 INFO: eval step:1    loss:  1.6004 top1: 0.5000 elapse: 0.091ss\n",
      "2020-06-17 04:09:40 INFO: eval step:2    loss:  0.3252 top1: 1.0000 elapse: 0.089ss\n",
      "2020-06-17 04:09:40 INFO: eval step:3    loss:  1.5030 top1: 0.5000 elapse: 0.088ss\n",
      "2020-06-17 04:09:40 INFO: eval step:4    loss:  1.2330 top1: 0.5000 elapse: 0.081ss\n",
      "2020-06-17 04:09:40 INFO: eval step:5    loss:  0.5781 top1: 0.7500 elapse: 0.082ss\n",
      "2020-06-17 04:09:40 INFO: eval step:6    loss:  0.6693 top1: 0.7500 elapse: 0.083ss\n",
      "2020-06-17 04:09:40 INFO: eval step:7    loss:  0.5757 top1: 0.8750 elapse: 0.082ss\n",
      "2020-06-17 04:09:40 INFO: eval step:8    loss:  1.1273 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:40 INFO: eval step:9    loss:  1.6467 top1: 0.6250 elapse: 0.078ss\n",
      "2020-06-17 04:09:40 INFO: eval step:10   loss:  1.5769 top1: 0.5000 elapse: 0.082ss\n",
      "2020-06-17 04:09:41 INFO: eval step:11   loss:  0.7449 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:41 INFO: eval step:12   loss:  0.2357 top1: 0.8750 elapse: 0.080ss\n",
      "2020-06-17 04:09:41 INFO: eval step:13   loss:  0.3032 top1: 1.0000 elapse: 0.082ss\n",
      "2020-06-17 04:09:41 INFO: eval step:14   loss:  1.5867 top1: 0.6250 elapse: 0.080ss\n",
      "2020-06-17 04:09:41 INFO: eval step:15   loss:  1.8010 top1: 0.5000 elapse: 0.081ss\n",
      "2020-06-17 04:09:41 INFO: eval step:16   loss:  1.0425 top1: 0.7500 elapse: 0.082ss\n",
      "2020-06-17 04:09:41 INFO: eval step:17   loss:  1.1368 top1: 0.6250 elapse: 0.080ss\n",
      "2020-06-17 04:09:41 INFO: eval step:18   loss:  1.3528 top1: 0.6250 elapse: 0.080ss\n",
      "2020-06-17 04:09:41 INFO: eval step:19   loss:  0.3800 top1: 0.8750 elapse: 0.081ss\n",
      "2020-06-17 04:09:41 INFO: eval step:20   loss:  0.3786 top1: 0.8750 elapse: 0.081ss\n",
      "2020-06-17 04:09:41 INFO: eval step:21   loss:  1.0241 top1: 0.7500 elapse: 0.080ss\n",
      "2020-06-17 04:09:41 INFO: eval step:22   loss:  1.8698 top1: 0.3750 elapse: 0.080ss\n",
      "2020-06-17 04:09:41 INFO: eval step:23   loss:  0.6595 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:42 INFO: eval step:24   loss:  0.4691 top1: 0.8750 elapse: 0.082ss\n",
      "2020-06-17 04:09:42 INFO: eval step:25   loss:  1.5452 top1: 0.5000 elapse: 0.082ss\n",
      "2020-06-17 04:09:42 INFO: eval step:26   loss:  1.5776 top1: 0.5000 elapse: 0.081ss\n",
      "2020-06-17 04:09:42 INFO: eval step:27   loss:  0.6384 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:42 INFO: eval step:28   loss:  0.4783 top1: 0.8750 elapse: 0.081ss\n",
      "2020-06-17 04:09:42 INFO: eval step:29   loss:  1.1866 top1: 0.6250 elapse: 0.082ss\n",
      "2020-06-17 04:09:42 INFO: eval step:30   loss:  0.3954 top1: 0.8750 elapse: 0.082ss\n",
      "2020-06-17 04:09:42 INFO: eval step:31   loss:  0.6350 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:42 INFO: eval step:32   loss:  1.4743 top1: 0.5000 elapse: 0.080ss\n",
      "2020-06-17 04:09:42 INFO: eval step:33   loss:  1.8597 top1: 0.3750 elapse: 0.080ss\n",
      "2020-06-17 04:09:42 INFO: eval step:34   loss:  0.6149 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:42 INFO: eval step:35   loss:  2.2628 top1: 0.5000 elapse: 0.081ss\n",
      "2020-06-17 04:09:43 INFO: eval step:36   loss:  1.0222 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:43 INFO: eval step:37   loss:  0.6975 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:43 INFO: eval step:38   loss:  1.4386 top1: 0.5000 elapse: 0.083ss\n",
      "2020-06-17 04:09:43 INFO: eval step:39   loss:  0.9328 top1: 0.5000 elapse: 0.080ss\n",
      "2020-06-17 04:09:43 INFO: eval step:40   loss:  0.8382 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:43 INFO: eval step:41   loss:  0.2529 top1: 1.0000 elapse: 0.082ss\n",
      "2020-06-17 04:09:43 INFO: eval step:42   loss:  1.1079 top1: 0.5000 elapse: 0.080ss\n",
      "2020-06-17 04:09:43 INFO: eval step:43   loss:  1.0179 top1: 0.7500 elapse: 0.080ss\n",
      "2020-06-17 04:09:43 INFO: eval step:44   loss:  1.2745 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:43 INFO: eval step:45   loss:  0.8242 top1: 0.8750 elapse: 0.080ss\n",
      "2020-06-17 04:09:43 INFO: eval step:46   loss:  1.0929 top1: 0.7500 elapse: 0.080ss\n",
      "2020-06-17 04:09:43 INFO: eval step:47   loss:  1.6033 top1: 0.3750 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:48   loss:  1.0982 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:49   loss:  1.0686 top1: 0.5000 elapse: 0.080ss\n",
      "2020-06-17 04:09:44 INFO: eval step:50   loss:  0.6602 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:51   loss:  1.0048 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:52   loss:  0.6689 top1: 0.8750 elapse: 0.080ss\n",
      "2020-06-17 04:09:44 INFO: eval step:53   loss:  2.2966 top1: 0.3750 elapse: 0.080ss\n",
      "2020-06-17 04:09:44 INFO: eval step:54   loss:  0.9139 top1: 0.7500 elapse: 0.080ss\n",
      "2020-06-17 04:09:44 INFO: eval step:55   loss:  0.7985 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:56   loss:  1.4964 top1: 0.5000 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:57   loss:  1.0253 top1: 0.6250 elapse: 0.082ss\n",
      "2020-06-17 04:09:44 INFO: eval step:58   loss:  0.5781 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:59   loss:  0.8359 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:44 INFO: eval step:60   loss:  1.0335 top1: 0.7500 elapse: 0.079ss\n",
      "2020-06-17 04:09:45 INFO: eval step:61   loss:  1.9198 top1: 0.3750 elapse: 0.080ss\n",
      "2020-06-17 04:09:45 INFO: eval step:62   loss:  1.7358 top1: 0.5000 elapse: 0.081ss\n",
      "2020-06-17 04:09:45 INFO: eval step:63   loss:  1.0584 top1: 0.7500 elapse: 0.082ss\n",
      "2020-06-17 04:09:45 INFO: eval step:64   loss:  1.0785 top1: 0.7500 elapse: 0.082ss\n",
      "2020-06-17 04:09:45 INFO: eval step:65   loss:  0.5311 top1: 0.8750 elapse: 0.082ss\n",
      "2020-06-17 04:09:45 INFO: eval step:66   loss:  1.2878 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:45 INFO: eval step:67   loss:  0.7858 top1: 0.7500 elapse: 0.082ss\n",
      "2020-06-17 04:09:45 INFO: eval step:68   loss:  1.3174 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:45 INFO: eval step:69   loss:  0.9059 top1: 0.6250 elapse: 0.080ss\n",
      "2020-06-17 04:09:45 INFO: eval step:70   loss:  1.5262 top1: 0.5000 elapse: 0.081ss\n",
      "2020-06-17 04:09:45 INFO: eval step:71   loss:  0.6832 top1: 0.7500 elapse: 0.080ss\n",
      "2020-06-17 04:09:45 INFO: eval step:72   loss:  1.7643 top1: 0.3750 elapse: 0.081ss\n",
      "2020-06-17 04:09:46 INFO: eval step:73   loss:  0.6946 top1: 0.8750 elapse: 0.079ss\n",
      "2020-06-17 04:09:46 INFO: eval step:74   loss:  1.4189 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:46 INFO: eval step:75   loss:  1.4134 top1: 0.6250 elapse: 0.079ss\n",
      "2020-06-17 04:09:46 INFO: eval step:76   loss:  1.3100 top1: 0.6250 elapse: 0.080ss\n",
      "2020-06-17 04:09:46 INFO: eval step:77   loss:  0.7022 top1: 0.8750 elapse: 0.080ss\n",
      "2020-06-17 04:09:46 INFO: eval step:78   loss:  1.9539 top1: 0.5000 elapse: 0.079ss\n",
      "2020-06-17 04:09:46 INFO: eval step:79   loss:  2.7565 top1: 0.2500 elapse: 0.081ss\n",
      "2020-06-17 04:09:46 INFO: eval step:80   loss:  0.7624 top1: 0.8750 elapse: 0.081ss\n",
      "2020-06-17 04:09:46 INFO: eval step:81   loss:  2.2545 top1: 0.1250 elapse: 0.081ss\n",
      "2020-06-17 04:09:46 INFO: eval step:82   loss:  0.3081 top1: 1.0000 elapse: 0.082ss\n",
      "2020-06-17 04:09:46 INFO: eval step:83   loss:  2.1620 top1: 0.3750 elapse: 0.082ss\n",
      "2020-06-17 04:09:46 INFO: eval step:84   loss:  0.6237 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:46 INFO: eval step:85   loss:  1.8962 top1: 0.5000 elapse: 0.079ss\n",
      "2020-06-17 04:09:47 INFO: eval step:86   loss:  0.6894 top1: 0.8750 elapse: 0.080ss\n",
      "2020-06-17 04:09:47 INFO: eval step:87   loss:  1.0337 top1: 0.7500 elapse: 0.080ss\n",
      "2020-06-17 04:09:47 INFO: eval step:88   loss:  0.9216 top1: 0.7500 elapse: 0.082ss\n",
      "2020-06-17 04:09:47 INFO: eval step:89   loss:  1.8303 top1: 0.2500 elapse: 0.082ss\n",
      "2020-06-17 04:09:47 INFO: eval step:90   loss:  2.0162 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:47 INFO: eval step:91   loss:  1.0357 top1: 0.7500 elapse: 0.080ss\n",
      "2020-06-17 04:09:47 INFO: eval step:92   loss:  2.7069 top1: 0.2500 elapse: 0.081ss\n",
      "2020-06-17 04:09:47 INFO: eval step:93   loss:  0.8981 top1: 0.7500 elapse: 0.081ss\n",
      "2020-06-17 04:09:47 INFO: eval step:94   loss:  1.1596 top1: 0.5000 elapse: 0.080ss\n",
      "2020-06-17 04:09:47 INFO: eval step:95   loss:  1.1892 top1: 0.6250 elapse: 0.081ss\n",
      "2020-06-17 04:09:47 INFO: END eval loss_avg:  1.1373 top1_avg: 0.6510 elapse_sum: 8.352ss\n"
     ]
    }
   ],
   "source": [
    "!python -m paddle.distributed.launch \\\n",
    "    --selected_gpus=\"0\" \\\n",
    "    tools/eval.py \\\n",
    "    -c ./configs/eval.yaml \\\n",
    "    -o ARCHITECTURE.name=\"SENet154_vd\" \\\n",
    "    -o pretrained_model=output/SENet154_vd/100/ppcls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!python tools/export_model.py \\\n",
    "    --model=\"SENet154_vd\" \\\n",
    "    --pretrained_model=output/SENet154_vd/100/ppcls \\\n",
    "    --output_path=output/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2020-06-15 20:17:24,995-INFO: class: 17\r\n",
      "2020-06-15 20:17:24,995-INFO: score: 0.5552724003791809\r\n"
     ]
    }
   ],
   "source": [
    "!python tools/infer/predict.py \\\n",
    "    -m output/model \\\n",
    "    -p output/params \\\n",
    "    -i dataset/coco/val/ba4a62171e2a35431045167893_28.jpg \\\n",
    "    --use_gpu=1 \\\n",
    "    --use_tensorrt=False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "img=Image.open('dataset/coco/val/ba4a62171e2a35431045167893_28.jpg')\n",
    "plt.xticks([])  #去掉x轴\n",
    "plt.yticks([])  #去掉y轴\n",
    "plt.axis('off')  #去掉坐标轴\n",
    "plt.imshow(img)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----------  Configuration Arguments -----------\n",
      "cluster_node_ips: 127.0.0.1\n",
      "log_dir: None\n",
      "node_ip: 127.0.0.1\n",
      "print_config: True\n",
      "selected_gpus: 0\n",
      "started_port: 6170\n",
      "training_script: tools/train.py\n",
      "training_script_args: ['-c', 'configs/Distillation/R50_vd_distill_MV3_large_x1_0.yaml']\n",
      "use_paddlecloud: False\n",
      "------------------------------------------------\n",
      "trainers_endpoints: 127.0.0.1:6170 , node_id: 0 , current_node_ip: 127.0.0.1 , num_nodes: 1 , node_ips: ['127.0.0.1'] , nranks: 1\n",
      "2020-06-17 05:10:11 INFO: \n",
      "===========================================================\n",
      "==        PaddleClas is powered by PaddlePaddle !        ==\n",
      "===========================================================\n",
      "==                                                       ==\n",
      "==   For more info please go to the following website.   ==\n",
      "==                                                       ==\n",
      "==       https://github.com/PaddlePaddle/PaddleClas      ==\n",
      "===========================================================\n",
      "\n",
      "2020-06-17 05:10:11 INFO: ARCHITECTURE : \n",
      "2020-06-17 05:10:11 INFO:     name : ResNet50_vd_distill_MobileNetV3_large_x1_0\n",
      "2020-06-17 05:10:11 INFO: ------------------------------------------------------------\n",
      "2020-06-17 05:10:11 INFO: LEARNING_RATE : \n",
      "2020-06-17 05:10:11 INFO:     function : CosineWarmup\n",
      "2020-06-17 05:10:11 INFO:     params : \n",
      "2020-06-17 05:10:11 INFO:         lr : 5e-05\n",
      "2020-06-17 05:10:11 INFO: ------------------------------------------------------------\n",
      "2020-06-17 05:10:11 INFO: OPTIMIZER : \n",
      "2020-06-17 05:10:11 INFO:     function : Momentum\n",
      "2020-06-17 05:10:11 INFO:     params : \n",
      "2020-06-17 05:10:11 INFO:         momentum : 0.9\n",
      "2020-06-17 05:10:11 INFO:     regularizer : \n",
      "2020-06-17 05:10:11 INFO:         factor : 1e-05\n",
      "2020-06-17 05:10:11 INFO:         function : L2\n",
      "2020-06-17 05:10:11 INFO: ------------------------------------------------------------\n",
      "2020-06-17 05:10:11 INFO: TRAIN : \n",
      "2020-06-17 05:10:11 INFO:     batch_size : 512\n",
      "2020-06-17 05:10:11 INFO:     data_dir : ./dataset/coco/\n",
      "2020-06-17 05:10:11 INFO:     file_list : ./dataset/coco/train_list.txt\n",
      "2020-06-17 05:10:11 INFO:     num_workers : 2\n",
      "2020-06-17 05:10:11 INFO:     shuffle_seed : 0\n",
      "2020-06-17 05:10:11 INFO:     transforms : \n",
      "2020-06-17 05:10:11 INFO:         DecodeImage : \n",
      "2020-06-17 05:10:11 INFO:             channel_first : False\n",
      "2020-06-17 05:10:11 INFO:             to_np : False\n",
      "2020-06-17 05:10:11 INFO:             to_rgb : True\n",
      "2020-06-17 05:10:11 INFO:         RandCropImage : \n",
      "2020-06-17 05:10:11 INFO:             size : 224\n",
      "2020-06-17 05:10:11 INFO:         RandFlipImage : \n",
      "2020-06-17 05:10:11 INFO:             flip_code : 1\n",
      "2020-06-17 05:10:11 INFO:         AutoAugment : None\n",
      "2020-06-17 05:10:11 INFO:         NormalizeImage : \n",
      "2020-06-17 05:10:11 INFO:             mean : [0.39, 0.37, 0.36]\n",
      "2020-06-17 05:10:11 INFO:             order : \n",
      "2020-06-17 05:10:11 INFO:             scale : 1./255.\n",
      "2020-06-17 05:10:11 INFO:             std : [0.11, 0.11, 0.1]\n",
      "2020-06-17 05:10:11 INFO:         ToCHWImage : None\n",
      "2020-06-17 05:10:11 INFO: ------------------------------------------------------------\n",
      "2020-06-17 05:10:11 INFO: VALID : \n",
      "2020-06-17 05:10:11 INFO:     batch_size : 256\n",
      "2020-06-17 05:10:11 INFO:     data_dir : ./dataset/coco/\n",
      "2020-06-17 05:10:11 INFO:     file_list : ./dataset/coco/val_list.txt\n",
      "2020-06-17 05:10:11 INFO:     num_workers : 2\n",
      "2020-06-17 05:10:11 INFO:     shuffle_seed : 0\n",
      "2020-06-17 05:10:11 INFO:     transforms : \n",
      "2020-06-17 05:10:11 INFO:         DecodeImage : \n",
      "2020-06-17 05:10:11 INFO:             channel_first : False\n",
      "2020-06-17 05:10:11 INFO:             to_np : False\n",
      "2020-06-17 05:10:11 INFO:             to_rgb : True\n",
      "2020-06-17 05:10:11 INFO:         ResizeImage : \n",
      "2020-06-17 05:10:11 INFO:             resize_short : 256\n",
      "2020-06-17 05:10:11 INFO:         CropImage : \n",
      "2020-06-17 05:10:11 INFO:             size : 224\n",
      "2020-06-17 05:10:11 INFO:         NormalizeImage : \n",
      "2020-06-17 05:10:11 INFO:             mean : [0.39, 0.37, 0.36]\n",
      "2020-06-17 05:10:11 INFO:             order : \n",
      "2020-06-17 05:10:11 INFO:             scale : 1.0/255.0\n",
      "2020-06-17 05:10:11 INFO:             std : [0.11, 0.11, 0.1]\n",
      "2020-06-17 05:10:11 INFO:         ToCHWImage : None\n",
      "2020-06-17 05:10:11 INFO: ------------------------------------------------------------\n",
      "2020-06-17 05:10:11 INFO: classes_num : 20\n",
      "2020-06-17 05:10:11 INFO: ema_decay : 0.9999\n",
      "2020-06-17 05:10:11 INFO: epochs : 120\n",
      "2020-06-17 05:10:11 INFO: image_shape : [3, 224, 224]\n",
      "2020-06-17 05:10:11 INFO: ls_epsilon : 0.1\n",
      "2020-06-17 05:10:11 INFO: mode : train\n",
      "2020-06-17 05:10:11 INFO: model_save_dir : ./output/\n",
      "2020-06-17 05:10:11 INFO: pretrained_model : ./pretrained/ResNet50_vd_ssld_pretrained/\n",
      "2020-06-17 05:10:11 INFO: save_interval : 20\n",
      "2020-06-17 05:10:11 INFO: topk : 1\n",
      "2020-06-17 05:10:11 INFO: total_images : 7728\n",
      "2020-06-17 05:10:11 INFO: use_aa : True\n",
      "2020-06-17 05:10:11 INFO: use_distillation : True\n",
      "2020-06-17 05:10:11 INFO: use_ema : True\n",
      "2020-06-17 05:10:11 INFO: valid_interval : 20\n",
      "2020-06-17 05:10:11 INFO: validate : True\n",
      "\n",
      "\n",
      "API is deprecated since 2.0.0 Please use FleetAPI instead.\n",
      "WIKI: https://github.com/PaddlePaddle/Fleet/blob/develop/markdown_doc/transpiler\n",
      "\n",
      "        \n",
      "W0616 21:10:22.839321 21327 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0\n",
      "W0616 21:10:22.842859 21327 device_context.cc:245] device: 0, cuDNN Version: 7.3.\n",
      "I0616 21:10:24.475378 21327 rpc_client.h:107] init rpc client with trainer_id 0\n",
      "2020-06-17 05:10:24 INFO: Loading parameters from ./pretrained/ResNet50_vd_ssld_pretrained/...\n",
      "2020-06-16 21:10:24,481-WARNING: ./pretrained/ResNet50_vd_ssld_pretrained/.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]\n",
      "2020-06-16 21:10:24,481-WARNING: ./pretrained/ResNet50_vd_ssld_pretrained/.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]\n",
      "2020-06-17 05:10:24 WARNING: variable fc_0.w_0 is already excluded automatically\n",
      "2020-06-17 05:10:24 WARNING: variable fc_0.b_0 is already excluded automatically\n",
      "2020-06-17 05:10:24 INFO: Finish initing model from ['./pretrained/ResNet50_vd_ssld_pretrained/']\n",
      "I0616 21:10:27.301753 21327 parallel_executor.cc:440] The Program will be executed on CUDA using ParallelExecutor, 1 cards are used, so 1 programs are executed in parallel.\n",
      "I0616 21:10:27.373699 21327 build_strategy.cc:365] SeqOnlyAllReduceOps:0, num_trainers:1\n",
      "I0616 21:10:27.453173 21327 parallel_executor.cc:307] Inplace strategy is enabled, when build_strategy.enable_inplace = True\n",
      "I0616 21:10:27.484635 21327 parallel_executor.cc:375] Garbage collection strategy is enabled, when FLAGS_eager_delete_tensor_gb = 0\n",
      "2020-06-17 05:10:28 INFO: epoch:0   train step:0    loss:  0.0966 top1: 0.0488 lr: 0.000000 elapse: 3.788s\n",
      "2020-06-17 05:10:30 INFO: epoch:0   train step:1    loss:  0.0969 top1: 0.0332 lr: 0.000001 elapse: 1.480s\n",
      "2020-06-17 05:10:31 INFO: epoch:0   train step:2    loss:  0.0989 top1: 0.0371 lr: 0.000001 elapse: 1.262s\n",
      "2020-06-17 05:10:32 INFO: epoch:0   train step:3    loss:  0.0934 top1: 0.0332 lr: 0.000002 elapse: 1.321s\n",
      "2020-06-17 05:10:34 INFO: epoch:0   train step:4    loss:  0.0974 top1: 0.0527 lr: 0.000003 elapse: 1.257s\n",
      "2020-06-17 05:10:35 INFO: epoch:0   train step:5    loss:  0.1062 top1: 0.0332 lr: 0.000003 elapse: 1.490s\n",
      "2020-06-17 05:10:36 INFO: epoch:0   train step:6    loss:  0.0941 top1: 0.0449 lr: 0.000004 elapse: 1.299s\n",
      "2020-06-17 05:10:38 INFO: epoch:0   train step:7    loss:  0.0971 top1: 0.0508 lr: 0.000005 elapse: 1.267s\n",
      "2020-06-17 05:10:39 INFO: epoch:0   train step:8    loss:  0.1034 top1: 0.0410 lr: 0.000005 elapse: 1.251s\n",
      "2020-06-17 05:10:40 INFO: epoch:0   train step:9    loss:  0.0993 top1: 0.0312 lr: 0.000006 elapse: 1.278s\n",
      "2020-06-17 05:10:41 INFO: epoch:0   train step:10   loss:  0.0890 top1: 0.0508 lr: 0.000007 elapse: 1.144s\n",
      "2020-06-17 05:10:42 INFO: epoch:0   train step:11   loss:  0.1067 top1: 0.0293 lr: 0.000007 elapse: 1.036s\n",
      "2020-06-17 05:10:43 INFO: epoch:0   train step:12   loss:  0.0960 top1: 0.0352 lr: 0.000008 elapse: 1.037s\n",
      "2020-06-17 05:10:43 INFO: END epoch:0   train loss_avg:  0.0981 top1_avg: 0.0401  elapse_sum: 18.910s\n",
      "2020-06-17 05:10:43 INFO: EMA validate start...\n",
      "I0616 21:10:44.912524 21327 parallel_executor.cc:440] The Program will be executed on CUDA using ParallelExecutor, 1 cards are used, so 1 programs are executed in parallel.\n",
      "I0616 21:10:44.940764 21327 build_strategy.cc:365] SeqOnlyAllReduceOps:0, num_trainers:1\n",
      "2020-06-17 05:10:45 INFO: epoch:0   valid step:0    loss:  0.0000 top1: 0.0625 elapse: 1.357s\n",
      "2020-06-17 05:10:45 INFO: epoch:0   valid step:1    loss:  0.0000 top1: 0.0273 elapse: 0.606s\n",
      "2020-06-17 05:10:46 INFO: epoch:0   valid step:2    loss:  0.0000 top1: 0.0469 elapse: 0.586s\n",
      "2020-06-17 05:10:46 INFO: END epoch:0   valid loss_avg:  0.0000 top1_avg: 0.0456 elapse_sum: 2.548s\n",
      "2020-06-17 05:10:46 INFO: EMA validate over!\n",
      "2020-06-17 05:10:48 INFO: epoch:0   valid step:0    loss:  0.0162 top1: 0.0391 elapse: 1.511s\n",
      "2020-06-17 05:10:48 INFO: epoch:0   valid step:1    loss:  0.0155 top1: 0.0234 elapse: 0.803s\n",
      "2020-06-17 05:10:49 INFO: epoch:0   valid step:2    loss:  0.0163 top1: 0.0195 elapse: 0.626s\n",
      "2020-06-17 05:10:49 INFO: END epoch:0   valid loss_avg:  0.0160 top1_avg: 0.0273 elapse_sum: 2.940s\n",
      "2020-06-17 05:10:49 INFO: The best top1 acc 0.02734, in epoch: 0\n",
      "2020-06-17 05:10:51 INFO: Already save model in ./output/ResNet50_vd_distill_MobileNetV3_large_x1_0/best_model_in_epoch_0\n",
      "2020-06-17 05:10:53 INFO: Already save model in ./output/ResNet50_vd_distill_MobileNetV3_large_x1_0/0\n",
      "2020-06-17 05:10:57 INFO: epoch:1   train step:0    loss:  0.0971 top1: 0.0391 lr: 0.000009 elapse: 3.571s\n",
      "2020-06-17 05:10:58 INFO: epoch:1   train step:1    loss:  0.0908 top1: 0.0391 lr: 0.000010 elapse: 1.557s\n",
      "2020-06-17 05:11:00 INFO: epoch:1   train step:2    loss:  0.0990 top1: 0.0488 lr: 0.000011 elapse: 1.298s\n",
      "2020-06-17 05:11:01 INFO: epoch:1   train step:3    loss:  0.0947 top1: 0.0469 lr: 0.000011 elapse: 1.438s\n",
      "2020-06-17 05:11:03 INFO: epoch:1   train step:4    loss:  0.0898 top1: 0.0215 lr: 0.000012 elapse: 1.308s\n",
      "2020-06-17 05:11:04 INFO: epoch:1   train step:5    loss:  0.0949 top1: 0.0371 lr: 0.000013 elapse: 1.258s\n",
      "2020-06-17 05:11:05 INFO: epoch:1   train step:6    loss:  0.1015 top1: 0.0508 lr: 0.000013 elapse: 1.400s\n",
      "2020-06-17 05:11:06 INFO: epoch:1   train step:7    loss:  0.0953 top1: 0.0508 lr: 0.000014 elapse: 1.297s\n",
      "2020-06-17 05:11:08 INFO: epoch:1   train step:8    loss:  0.0978 top1: 0.0527 lr: 0.000015 elapse: 1.256s\n",
      "2020-06-17 05:11:09 INFO: epoch:1   train step:9    loss:  0.1000 top1: 0.0449 lr: 0.000015 elapse: 1.256s\n",
      "2020-06-17 05:11:10 INFO: epoch:1   train step:10   loss:  0.0989 top1: 0.0332 lr: 0.000016 elapse: 1.262s\n",
      "2020-06-17 05:11:11 INFO: epoch:1   train step:11   loss:  0.0882 top1: 0.0547 lr: 0.000017 elapse: 1.035s\n",
      "2020-06-17 05:11:12 INFO: epoch:1   train step:12   loss:  0.0987 top1: 0.0332 lr: 0.000017 elapse: 1.032s\n",
      "2020-06-17 05:11:12 INFO: END epoch:1   train loss_avg:  0.0959 top1_avg: 0.0425  elapse_sum: 18.968s\n",
      "2020-06-17 05:11:16 INFO: epoch:2   train step:0    loss:  0.0951 top1: 0.0332 lr: 0.000018 elapse: 3.587s\n",
      "2020-06-17 05:11:17 INFO: epoch:2   train step:1    loss:  0.0891 top1: 0.0391 lr: 0.000019 elapse: 1.535s\n",
      "2020-06-17 05:11:19 INFO: epoch:2   train step:2    loss:  0.0945 top1: 0.0391 lr: 0.000019 elapse: 1.601s\n",
      "2020-06-17 05:11:20 INFO: epoch:2   train step:3    loss:  0.0899 top1: 0.0508 lr: 0.000020 elapse: 1.325s\n",
      "2020-06-17 05:11:22 INFO: epoch:2   train step:4    loss:  0.0955 top1: 0.0469 lr: 0.000021 elapse: 1.254s\n",
      "2020-06-17 05:11:23 INFO: epoch:2   train step:5    loss:  0.0899 top1: 0.0332 lr: 0.000021 elapse: 1.715s\n",
      "2020-06-17 05:11:25 INFO: epoch:2   train step:6    loss:  0.0972 top1: 0.0430 lr: 0.000022 elapse: 1.282s\n",
      "2020-06-17 05:11:26 INFO: epoch:2   train step:7    loss:  0.0924 top1: 0.0605 lr: 0.000023 elapse: 1.498s\n",
      "2020-06-17 05:11:27 INFO: epoch:2   train step:8    loss:  0.0921 top1: 0.0488 lr: 0.000023 elapse: 1.267s\n",
      "2020-06-17 05:11:29 INFO: epoch:2   train step:9    loss:  0.0927 top1: 0.0371 lr: 0.000024 elapse: 1.282s\n",
      "2020-06-17 05:11:30 INFO: epoch:2   train step:10   loss:  0.0879 top1: 0.0430 lr: 0.000025 elapse: 1.286s\n",
      "2020-06-17 05:11:31 INFO: epoch:2   train step:11   loss:  0.0905 top1: 0.0449 lr: 0.000025 elapse: 1.035s\n",
      "2020-06-17 05:11:32 INFO: epoch:2   train step:12   loss:  0.0904 top1: 0.0312 lr: 0.000026 elapse: 1.036s\n",
      "2020-06-17 05:11:32 INFO: END epoch:2   train loss_avg:  0.0921 top1_avg: 0.0424  elapse_sum: 19.702s\n",
      "2020-06-17 05:11:36 INFO: epoch:3   train step:0    loss:  0.0943 top1: 0.0312 lr: 0.000027 elapse: 3.519s\n",
      "2020-06-17 05:11:37 INFO: epoch:3   train step:1    loss:  0.0976 top1: 0.0430 lr: 0.000027 elapse: 1.547s\n",
      "2020-06-17 05:11:39 INFO: epoch:3   train step:2    loss:  0.0966 top1: 0.0430 lr: 0.000028 elapse: 1.444s\n",
      "2020-06-17 05:11:40 INFO: epoch:3   train step:3    loss:  0.0835 top1: 0.0547 lr: 0.000029 elapse: 1.271s\n",
      "2020-06-17 05:11:41 INFO: epoch:3   train step:4    loss:  0.0930 top1: 0.0449 lr: 0.000029 elapse: 1.252s\n",
      "2020-06-17 05:11:43 INFO: epoch:3   train step:5    loss:  0.0862 top1: 0.0488 lr: 0.000030 elapse: 1.753s\n",
      "2020-06-17 05:11:44 INFO: epoch:3   train step:6    loss:  0.0909 top1: 0.0371 lr: 0.000031 elapse: 1.292s\n",
      "2020-06-17 05:11:45 INFO: epoch:3   train step:7    loss:  0.0904 top1: 0.0352 lr: 0.000031 elapse: 1.258s\n",
      "2020-06-17 05:11:47 INFO: epoch:3   train step:8    loss:  0.0854 top1: 0.0391 lr: 0.000032 elapse: 1.256s\n",
      "2020-06-17 05:11:48 INFO: epoch:3   train step:9    loss:  0.0882 top1: 0.0508 lr: 0.000033 elapse: 1.270s\n",
      "2020-06-17 05:11:49 INFO: epoch:3   train step:10   loss:  0.0794 top1: 0.0449 lr: 0.000033 elapse: 1.270s\n",
      "2020-06-17 05:11:50 INFO: epoch:3   train step:11   loss:  0.0931 top1: 0.0449 lr: 0.000034 elapse: 1.036s\n",
      "2020-06-17 05:11:51 INFO: epoch:3   train step:12   loss:  0.0989 top1: 0.0391 lr: 0.000035 elapse: 1.036s\n",
      "2020-06-17 05:11:51 INFO: END epoch:3   train loss_avg:  0.0906 top1_avg: 0.0428  elapse_sum: 19.203s\n",
      "2020-06-17 05:11:55 INFO: epoch:4   train step:0    loss:  0.0883 top1: 0.0449 lr: 0.000035 elapse: 3.597s\n",
      "2020-06-17 05:11:56 INFO: epoch:4   train step:1    loss:  0.0929 top1: 0.0469 lr: 0.000036 elapse: 1.425s\n",
      "2020-06-17 05:11:58 INFO: epoch:4   train step:2    loss:  0.0886 top1: 0.0293 lr: 0.000037 elapse: 1.537s\n",
      "2020-06-17 05:11:59 INFO: epoch:4   train step:3    loss:  0.0886 top1: 0.0391 lr: 0.000037 elapse: 1.532s\n",
      "2020-06-17 05:12:01 INFO: epoch:4   train step:4    loss:  0.0968 top1: 0.0449 lr: 0.000038 elapse: 1.291s\n",
      "2020-06-17 05:12:02 INFO: epoch:4   train step:5    loss:  0.0880 top1: 0.0371 lr: 0.000039 elapse: 1.256s\n",
      "2020-06-17 05:12:04 INFO: epoch:4   train step:6    loss:  0.0917 top1: 0.0391 lr: 0.000039 elapse: 1.637s\n",
      "2020-06-17 05:12:05 INFO: epoch:4   train step:7    loss:  0.0833 top1: 0.0293 lr: 0.000040 elapse: 1.280s\n",
      "2020-06-17 05:12:06 INFO: epoch:4   train step:8    loss:  0.0828 top1: 0.0527 lr: 0.000041 elapse: 1.250s\n",
      "2020-06-17 05:12:07 INFO: epoch:4   train step:9    loss:  0.0852 top1: 0.0547 lr: 0.000041 elapse: 1.263s\n",
      "2020-06-17 05:12:09 INFO: epoch:4   train step:10   loss:  0.0861 top1: 0.0410 lr: 0.000042 elapse: 1.265s\n",
      "2020-06-17 05:12:10 INFO: epoch:4   train step:11   loss:  0.0859 top1: 0.0586 lr: 0.000043 elapse: 1.033s\n",
      "2020-06-17 05:12:11 INFO: epoch:4   train step:12   loss:  0.0888 top1: 0.0332 lr: 0.000043 elapse: 1.032s\n",
      "2020-06-17 05:12:11 INFO: END epoch:4   train loss_avg:  0.0882 top1_avg: 0.0424  elapse_sum: 19.396s\n",
      "2020-06-17 05:12:14 INFO: epoch:5   train step:0    loss:  0.0813 top1: 0.0254 lr: 0.000044 elapse: 3.501s\n",
      "2020-06-17 05:12:16 INFO: epoch:5   train step:1    loss:  0.0867 top1: 0.0371 lr: 0.000045 elapse: 1.539s\n",
      "2020-06-17 05:12:17 INFO: epoch:5   train step:2    loss:  0.0835 top1: 0.0273 lr: 0.000045 elapse: 1.604s\n",
      "2020-06-17 05:12:18 INFO: epoch:5   train step:3    loss:  0.0815 top1: 0.0449 lr: 0.000046 elapse: 1.171s\n",
      "2020-06-17 05:12:20 INFO: epoch:5   train step:4    loss:  0.0836 top1: 0.0508 lr: 0.000047 elapse: 1.285s\n",
      "2020-06-17 05:12:21 INFO: epoch:5   train step:5    loss:  0.0843 top1: 0.0410 lr: 0.000047 elapse: 1.650s\n",
      "2020-06-17 05:12:23 INFO: epoch:5   train step:6    loss:  0.0805 top1: 0.0449 lr: 0.000048 elapse: 1.277s\n",
      "2020-06-17 05:12:24 INFO: epoch:5   train step:7    loss:  0.0823 top1: 0.0430 lr: 0.000049 elapse: 1.660s\n",
      "2020-06-17 05:12:26 INFO: epoch:5   train step:8    loss:  0.0784 top1: 0.0352 lr: 0.000049 elapse: 1.273s\n",
      "2020-06-17 05:12:27 INFO: epoch:5   train step:9    loss:  0.0871 top1: 0.0371 lr: 0.000050 elapse: 1.261s\n",
      "2020-06-17 05:12:28 INFO: epoch:5   train step:10   loss:  0.0861 top1: 0.0547 lr: 0.000050 elapse: 1.261s\n",
      "2020-06-17 05:12:29 INFO: epoch:5   train step:11   loss:  0.0697 top1: 0.0508 lr: 0.000050 elapse: 1.035s\n",
      "2020-06-17 05:12:30 INFO: epoch:5   train step:12   loss:  0.0765 top1: 0.0332 lr: 0.000050 elapse: 1.036s\n",
      "2020-06-17 05:12:30 INFO: END epoch:5   train loss_avg:  0.0817 top1_avg: 0.0404  elapse_sum: 19.553s\n",
      "2020-06-17 05:12:34 INFO: epoch:6   train step:0    loss:  0.0780 top1: 0.0371 lr: 0.000050 elapse: 3.695s\n",
      "2020-06-17 05:12:35 INFO: epoch:6   train step:1    loss:  0.0766 top1: 0.0547 lr: 0.000050 elapse: 1.546s\n",
      "2020-06-17 05:12:37 INFO: epoch:6   train step:2    loss:  0.0840 top1: 0.0449 lr: 0.000050 elapse: 1.365s\n",
      "2020-06-17 05:12:38 INFO: epoch:6   train step:3    loss:  0.0802 top1: 0.0410 lr: 0.000050 elapse: 1.489s\n",
      "^C\n",
      "2020-06-16 21:12:39,570-WARNING: KeyboardInterrupt, exit\n",
      "2020-06-17 05:12:39 INFO: main proc 21502 exit, kill process group 21269\n",
      "2020-06-17 05:12:39 INFO: main proc 21504 exit, kill process group 21269\n",
      "WARNING 2020-06-16 21:12:39,570 launch.py:278] KeyboardInterrupt, exit\n"
     ]
    }
   ],
   "source": [
    "!python -m paddle.distributed.launch \\\n",
    "    --selected_gpus=\"0\" \\\n",
    "    tools/train.py \\\n",
    "    -c configs/Distillation/R50_vd_distill_MV3_large_x1_0.yaml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2020-06-17 06:41:30 INFO: END epoch:359 train loss_avg:  1.0555 top1_avg: 0.8180  elapse_sum: 14.541s\r"
     ]
    }
   ],
   "source": [
    "!python -m paddle.distributed.launch \\\n",
    "    --selected_gpus=\"0\" \\\n",
    "    tools/train.py \\\n",
    "    -c configs/EfficientNet/EfficientNetB0.yaml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----------  Configuration Arguments -----------\n",
      "cluster_node_ips: 127.0.0.1\n",
      "log_dir: None\n",
      "node_ip: 127.0.0.1\n",
      "print_config: True\n",
      "selected_gpus: 0\n",
      "started_port: 6170\n",
      "training_script: tools/eval.py\n",
      "training_script_args: ['-c', './configs/EfficientNet/EfficientNetB0.yaml', '-o', 'ARCHITECTURE.name=EfficientNetB0', '-o', 'pretrained_model=output/EfficientNetB0/180/ppcls']\n",
      "use_paddlecloud: False\n",
      "------------------------------------------------\n",
      "trainers_endpoints: 127.0.0.1:6170 , node_id: 0 , current_node_ip: 127.0.0.1 , num_nodes: 1 , node_ips: ['127.0.0.1'] , nranks: 1\n",
      "2020-06-17 07:28:28 INFO: \n",
      "===========================================================\n",
      "==        PaddleClas is powered by PaddlePaddle !        ==\n",
      "===========================================================\n",
      "==                                                       ==\n",
      "==   For more info please go to the following website.   ==\n",
      "==                                                       ==\n",
      "==       https://github.com/PaddlePaddle/PaddleClas      ==\n",
      "===========================================================\n",
      "\n",
      "2020-06-17 07:28:28 INFO: ARCHITECTURE : \n",
      "2020-06-17 07:28:28 INFO:     name : EfficientNetB0\n",
      "2020-06-17 07:28:28 INFO:     params : \n",
      "2020-06-17 07:28:28 INFO:         is_test : False\n",
      "2020-06-17 07:28:28 INFO:         override_params : \n",
      "2020-06-17 07:28:28 INFO:             drop_connect_rate : 0.1\n",
      "2020-06-17 07:28:28 INFO:         padding_type : SAME\n",
      "2020-06-17 07:28:28 INFO: ------------------------------------------------------------\n",
      "2020-06-17 07:28:28 INFO: LEARNING_RATE : \n",
      "2020-06-17 07:28:28 INFO:     function : ExponentialWarmup\n",
      "2020-06-17 07:28:28 INFO:     params : \n",
      "2020-06-17 07:28:28 INFO:         lr : 0.0004\n",
      "2020-06-17 07:28:28 INFO: ------------------------------------------------------------\n",
      "2020-06-17 07:28:28 INFO: OPTIMIZER : \n",
      "2020-06-17 07:28:28 INFO:     function : RMSProp\n",
      "2020-06-17 07:28:28 INFO:     params : \n",
      "2020-06-17 07:28:28 INFO:         epsilon : 0.001\n",
      "2020-06-17 07:28:28 INFO:         momentum : 0.9\n",
      "2020-06-17 07:28:28 INFO:         rho : 0.9\n",
      "2020-06-17 07:28:28 INFO:     regularizer : \n",
      "2020-06-17 07:28:28 INFO:         factor : 1e-05\n",
      "2020-06-17 07:28:28 INFO:         function : L2\n",
      "2020-06-17 07:28:28 INFO: ------------------------------------------------------------\n",
      "2020-06-17 07:28:28 INFO: TRAIN : \n",
      "2020-06-17 07:28:28 INFO:     batch_size : 64\n",
      "2020-06-17 07:28:28 INFO:     data_dir : ./dataset/coco/\n",
      "2020-06-17 07:28:28 INFO:     file_list : ./dataset/coco/train_list.txt\n",
      "2020-06-17 07:28:28 INFO:     num_workers : 2\n",
      "2020-06-17 07:28:28 INFO:     shuffle_seed : 1\n",
      "2020-06-17 07:28:28 INFO:     transforms : \n",
      "2020-06-17 07:28:28 INFO:         DecodeImage : \n",
      "2020-06-17 07:28:28 INFO:             channel_first : False\n",
      "2020-06-17 07:28:28 INFO:             to_np : Fals\n",
      "2020-06-17 07:28:28 INFO:             to_rgb : True\n",
      "2020-06-17 07:28:28 INFO:         RandCropImage : \n",
      "2020-06-17 07:28:28 INFO:             interpolation : 2\n",
      "2020-06-17 07:28:28 INFO:             size : 224\n",
      "2020-06-17 07:28:28 INFO:         RandFlipImage : \n",
      "2020-06-17 07:28:28 INFO:             flip_code : 1\n",
      "2020-06-17 07:28:28 INFO:         AutoAugment : None\n",
      "2020-06-17 07:28:28 INFO:         NormalizeImage : \n",
      "2020-06-17 07:28:28 INFO:             mean : [0.39, 0.37, 0.37]\n",
      "2020-06-17 07:28:28 INFO:             order : \n",
      "2020-06-17 07:28:28 INFO:             scale : 1./255.\n",
      "2020-06-17 07:28:28 INFO:             std : [0.11, 0.11, 0.1]\n",
      "2020-06-17 07:28:28 INFO:         ToCHWImage : None\n",
      "2020-06-17 07:28:28 INFO: ------------------------------------------------------------\n",
      "2020-06-17 07:28:28 INFO: VALID : \n",
      "2020-06-17 07:28:28 INFO:     batch_size : 64\n",
      "2020-06-17 07:28:28 INFO:     data_dir : ./dataset/coco/\n",
      "2020-06-17 07:28:28 INFO:     file_list : ./dataset/coco/val_list.txt\n",
      "2020-06-17 07:28:28 INFO:     num_workers : 2\n",
      "2020-06-17 07:28:28 INFO:     shuffle_seed : 1\n",
      "2020-06-17 07:28:28 INFO:     transforms : \n",
      "2020-06-17 07:28:28 INFO:         DecodeImage : \n",
      "2020-06-17 07:28:28 INFO:             channel_first : False\n",
      "2020-06-17 07:28:28 INFO:             to_np : False\n",
      "2020-06-17 07:28:28 INFO:             to_rgb : True\n",
      "2020-06-17 07:28:28 INFO:         ResizeImage : \n",
      "2020-06-17 07:28:28 INFO:             interpolation : 2\n",
      "2020-06-17 07:28:28 INFO:             resize_short : 256\n",
      "2020-06-17 07:28:28 INFO:         CropImage : \n",
      "2020-06-17 07:28:28 INFO:             size : 224\n",
      "2020-06-17 07:28:28 INFO:         NormalizeImage : \n",
      "2020-06-17 07:28:28 INFO:             mean : [0.39, 0.37, 0.36]\n",
      "2020-06-17 07:28:28 INFO:             order : \n",
      "2020-06-17 07:28:28 INFO:             scale : 1.0/255.0\n",
      "2020-06-17 07:28:28 INFO:             std : [0.11, 0.11, 0.1]\n",
      "2020-06-17 07:28:28 INFO:         ToCHWImage : None\n",
      "2020-06-17 07:28:28 INFO: ------------------------------------------------------------\n",
      "2020-06-17 07:28:28 INFO: classes_num : 20\n",
      "2020-06-17 07:28:28 INFO: ema_decay : 0.9999\n",
      "2020-06-17 07:28:28 INFO: epochs : 360\n",
      "2020-06-17 07:28:28 INFO: image_shape : [3, 224, 224]\n",
      "2020-06-17 07:28:28 INFO: ls_epsilon : 0.1\n",
      "2020-06-17 07:28:28 INFO: mode : train\n",
      "2020-06-17 07:28:28 INFO: model_save_dir : ./output/\n",
      "2020-06-17 07:28:28 INFO: pretrained_model : output/EfficientNetB0/180/ppcls\n",
      "2020-06-17 07:28:28 INFO: save_interval : 60\n",
      "2020-06-17 07:28:28 INFO: topk : 1\n",
      "2020-06-17 07:28:28 INFO: total_images : 7728\n",
      "2020-06-17 07:28:28 INFO: use_aa : True\n",
      "2020-06-17 07:28:28 INFO: use_ema : True\n",
      "2020-06-17 07:28:28 INFO: valid_interval : 60\n",
      "2020-06-17 07:28:28 INFO: validate : True\n",
      "W0616 23:28:29.469497 24971 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0\n",
      "W0616 23:28:29.473304 24971 device_context.cc:245] device: 0, cuDNN Version: 7.3.\n",
      "2020-06-17 07:28:31 INFO: Loading parameters from output/EfficientNetB0/180/ppcls...\n",
      "2020-06-17 07:28:31 INFO: Finish initing model from ['output/EfficientNetB0/180/ppcls']\n",
      "I0616 23:28:31.723942 24971 parallel_executor.cc:440] The Program will be executed on CUDA using ParallelExecutor, 1 cards are used, so 1 programs are executed in parallel.\n",
      "I0616 23:28:31.743309 24971 build_strategy.cc:365] SeqOnlyAllReduceOps:0, num_trainers:1\n",
      "I0616 23:28:31.752593 24971 parallel_executor.cc:307] Inplace strategy is enabled, when build_strategy.enable_inplace = True\n",
      "I0616 23:28:31.771991 24971 parallel_executor.cc:375] Garbage collection strategy is enabled, when FLAGS_eager_delete_tensor_gb = 0\n",
      "2020-06-17 07:28:31 INFO: eval step:0    loss:  1.1854 top1: 0.7656 elapse: 0.566ss\n",
      "2020-06-17 07:28:32 INFO: eval step:1    loss:  1.3063 top1: 0.7500 elapse: 0.179ss\n",
      "2020-06-17 07:28:32 INFO: eval step:2    loss:  1.3601 top1: 0.7500 elapse: 0.131ss\n",
      "2020-06-17 07:28:32 INFO: eval step:3    loss:  1.4840 top1: 0.6875 elapse: 0.111ss\n",
      "2020-06-17 07:28:32 INFO: eval step:4    loss:  1.2442 top1: 0.7812 elapse: 0.108ss\n",
      "2020-06-17 07:28:32 INFO: eval step:5    loss:  1.5540 top1: 0.6719 elapse: 0.099ss\n",
      "2020-06-17 07:28:32 INFO: eval step:6    loss:  1.4437 top1: 0.6875 elapse: 0.100ss\n",
      "2020-06-17 07:28:32 INFO: eval step:7    loss:  1.4606 top1: 0.6250 elapse: 0.106ss\n",
      "2020-06-17 07:28:32 INFO: eval step:8    loss:  1.3271 top1: 0.7812 elapse: 0.102ss\n",
      "2020-06-17 07:28:32 INFO: eval step:9    loss:  1.2501 top1: 0.7656 elapse: 0.108ss\n",
      "2020-06-17 07:28:32 INFO: eval step:10   loss:  1.5433 top1: 0.6094 elapse: 0.103ss\n",
      "2020-06-17 07:28:33 INFO: eval step:11   loss:  1.4600 top1: 0.6094 elapse: 0.100ss\n",
      "2020-06-17 07:28:33 INFO: END eval loss_avg:  1.3849 top1_avg: 0.7070 elapse_sum: 1.812ss\n"
     ]
    }
   ],
   "source": [
    "!python -m paddle.distributed.launch \\\n",
    "    --selected_gpus=\"0\" \\\n",
    "    tools/eval.py \\\n",
    "    -c ./configs/EfficientNet/EfficientNetB0.yaml \\\n",
    "    -o ARCHITECTURE.name=\"EfficientNetB0\" \\\n",
    "    -o pretrained_model=output/EfficientNetB0/180/ppcls"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 使用Cascade RCNN增强模型训练\n",
    "这里使用模型库提供的rcnn_enhance解决方案\n",
    "## 服务器端实用目标检测方案\n",
    "\n",
    "### 简介\n",
    "\n",
    "* 近年来，学术界和工业界广泛关注图像中目标检测任务。基于[PaddleClas](https://github.com/PaddlePaddle/PaddleClas)中SSLD蒸馏方案训练得到的ResNet50_vd预训练模型(ImageNet1k验证集上Top1 Acc为82.39%)，结合PaddleDetection中的丰富算子，飞桨提供了一种面向服务器端实用的目标检测方案PSS-DET(Practical Server Side Detection)。基于COCO2017目标检测数据集，V100单卡预测速度为为61FPS时，COCO mAP可达41.6%；预测速度为20FPS时，COCO mAP可达47.8%。\n",
    "\n",
    "* 以标准的Faster RCNN ResNet50_vd FPN为例，下表给出了PSS-DET不同的模块的速度与精度收益。\n",
    "\n",
    "| Trick | Train scale | Test scale |  COCO mAP | Infer speed/FPS |\n",
    "|- |:-: |:-: | :-: | :-: |\n",
    "| `baseline` | 640x640 | 640x640 | 36.4% | 43.589 |\n",
    "| +`test proposal=pre/post topk 500/300` | 640x640 | 640x640 | 36.2% | 52.512 |\n",
    "| +`fpn channel=64` | 640x640 | 640x640 | 35.1% | 67.450 |\n",
    "| +`ssld pretrain` | 640x640 | 640x640 | 36.3% | 67.450 |\n",
    "| +`ciou loss` | 640x640 | 640x640 | 37.1% | 67.450 |\n",
    "| +`DCNv2` | 640x640 | 640x640 | 39.4% | 60.345 |\n",
    "| +`3x, multi-scale training` | 640x640 | 640x640 | 41.0% | 60.345 |\n",
    "| +`auto augment` | 640x640 | 640x640 | 41.4% | 60.345 |\n",
    "| +`libra sampling` | 640x640 | 640x640 | 41.6% | 60.345 |\n",
    "\n",
    "\n",
    "基于该实验结论，PaddleDetection结合Cascade RCNN，使用更大的训练与评估尺度(1000x1500)，最终在单卡V100上速度为20FPS，COCO mAP达47.8%。下图给出了目前类似速度的目标检测方法的速度与精度指标。\n",
    "\n",
    "### 模型库\n",
    "\n",
    "| 骨架网络             | 网络类型       | 每张GPU图片个数 | 学习率策略 |推理时间(fps) | Box AP | Mask AP |                           下载                          | 配置文件 |\n",
    "| :---------------------- | :-------------:  | :-------: | :-----: | :------------: | :----: | :-----: | :-------------: | :-----: |\n",
    "| ResNet50-vd-FPN-Dcnv2         | Faster     |     2     |   3x    |     61.425     |  41.6  |    -    | [model](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_dcn_r50_vd_fpn_3x_server_side.tar) |  [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_server_side_det/faster_rcnn_dcn_r50_vd_fpn_3x_server_side.yml) |\n",
    "| ResNet50-vd-FPN-Dcnv2         | Cascade Faster     |     2     |   3x    |     20.001     |  47.8  |    -    | [model](https://paddlemodels.bj.bcebos.com/object_detection/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.tar) | [config](https://github.com/PaddlePaddle/PaddleDetection/tree/master/configs/rcnn_server_side_det/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml) |\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "对配置文件`./configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml`做如下修改\n",
    "- 修改类别数\n",
    "- 修改数据集RGB通道的均值和标准差\n",
    "- 使用迁移模型训练策略，调整学习率\n",
    "\n",
    "参考配置文件示例如下\n",
    "```yml\n",
    "architecture: CascadeRCNN\n",
    "max_iters: 270000\n",
    "snapshot_iter: 30000\n",
    "use_gpu: true\n",
    "log_smooth_window: 200\n",
    "log_iter: 200\n",
    "save_dir: output\n",
    "pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.tar\n",
    "finetune_exclude_pretrained_params: ['cls_score', 'bbox_pred']\n",
    "weights: output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/model_final\n",
    "metric: COCO\n",
    "num_classes: 21\n",
    "\n",
    "CascadeRCNN:\n",
    "  backbone: ResNet\n",
    "  fpn: FPN\n",
    "  rpn_head: FPNRPNHead\n",
    "  roi_extractor: FPNRoIAlign\n",
    "  bbox_head: CascadeBBoxHead\n",
    "  bbox_assigner: CascadeBBoxAssigner\n",
    "\n",
    "ResNet:\n",
    "  norm_type: bn\n",
    "  depth: 50\n",
    "  feature_maps: [2, 3, 4, 5]\n",
    "  freeze_at: 2\n",
    "  variant: d\n",
    "  dcn_v2_stages: [3, 4, 5]\n",
    "  lr_mult_list: [0.05, 0.05, 0.1, 0.15]\n",
    "\n",
    "FPN:\n",
    "  max_level: 6\n",
    "  min_level: 2\n",
    "  num_chan: 64\n",
    "  spatial_scale: [0.03125, 0.0625, 0.125, 0.25]\n",
    "\n",
    "FPNRPNHead:\n",
    "  anchor_generator:\n",
    "    anchor_sizes: [32, 64, 128, 256, 512]\n",
    "    aspect_ratios: [0.5, 1.0, 2.0]\n",
    "    stride: [16.0, 16.0]\n",
    "    variance: [1.0, 1.0, 1.0, 1.0]\n",
    "  anchor_start_size: 32\n",
    "  min_level: 2\n",
    "  max_level: 6\n",
    "  num_chan: 64\n",
    "  rpn_target_assign:\n",
    "    rpn_batch_size_per_im: 256\n",
    "    rpn_fg_fraction: 0.5\n",
    "    rpn_positive_overlap: 0.7\n",
    "    rpn_negative_overlap: 0.3\n",
    "    rpn_straddle_thresh: 0.0\n",
    "  train_proposal:\n",
    "    min_size: 0.0\n",
    "    nms_thresh: 0.7\n",
    "    pre_nms_top_n: 2000\n",
    "    post_nms_top_n: 2000\n",
    "  test_proposal:\n",
    "    min_size: 0.0\n",
    "    nms_thresh: 0.7\n",
    "    pre_nms_top_n: 500\n",
    "    post_nms_top_n: 300\n",
    "\n",
    "FPNRoIAlign:\n",
    "  canconical_level: 4\n",
    "  canonical_size: 224\n",
    "  min_level: 2\n",
    "  max_level: 5\n",
    "  box_resolution: 7\n",
    "  sampling_ratio: 2\n",
    "\n",
    "CascadeBBoxAssigner:\n",
    "  batch_size_per_im: 512\n",
    "  bbox_reg_weights: [10, 20, 30]\n",
    "  bg_thresh_lo: [0.0, 0.0, 0.0]\n",
    "  bg_thresh_hi: [0.5, 0.6, 0.7]\n",
    "  fg_thresh: [0.5, 0.6, 0.7]\n",
    "  fg_fraction: 0.25\n",
    "\n",
    "CascadeBBoxHead:\n",
    "  head: CascadeTwoFCHead\n",
    "  bbox_loss: BalancedL1Loss\n",
    "  nms:\n",
    "    keep_top_k: 100\n",
    "    nms_threshold: 0.5\n",
    "    score_threshold: 0.05\n",
    "\n",
    "BalancedL1Loss:\n",
    "  alpha: 0.5\n",
    "  gamma: 1.5\n",
    "  beta: 1.0\n",
    "  loss_weight: 1.0\n",
    "\n",
    "CascadeTwoFCHead:\n",
    "  mlp_dim: 1024\n",
    "\n",
    "LearningRate:\n",
    "  base_lr: 0.00025\n",
    "  schedulers:\n",
    "  - !PiecewiseDecay\n",
    "    gamma: 0.1\n",
    "    milestones: [180000, 240000]\n",
    "  - !LinearWarmup\n",
    "    start_factor: 0.1\n",
    "    steps: 1000\n",
    "\n",
    "OptimizerBuilder:\n",
    "  optimizer:\n",
    "    momentum: 0.9\n",
    "    type: Momentum\n",
    "  regularizer:\n",
    "    factor: 0.0001\n",
    "    type: L2\n",
    "\n",
    "TrainReader:\n",
    "  inputs_def:\n",
    "    fields: ['image', 'im_info', 'im_id', 'gt_bbox', 'gt_class', 'is_crowd']\n",
    "  dataset:\n",
    "    !COCODataSet\n",
    "    image_dir: train2017\n",
    "    anno_path: annotations/instances_train2017.json\n",
    "    dataset_dir: /home/aistudio/PaddleDetection/dataset/coco\n",
    "  sample_transforms:\n",
    "  - !DecodeImage\n",
    "    to_rgb: true\n",
    "  - !RandomFlipImage\n",
    "    prob: 0.5\n",
    "  - !AutoAugmentImage\n",
    "    autoaug_type: v1\n",
    "  - !NormalizeImage\n",
    "    is_channel_first: false\n",
    "    is_scale: true\n",
    "    mean: [0.37,0.36,0.36]\n",
    "    std: [0.11, 0.10,0.10]\n",
    "  - !ResizeImage\n",
    "    target_size: [640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024]\n",
    "    max_size: 1500\n",
    "    interp: 1\n",
    "    use_cv2: true\n",
    "  - !Permute\n",
    "    to_bgr: false\n",
    "    channel_first: true\n",
    "  batch_transforms:\n",
    "  - !PadBatch\n",
    "    pad_to_stride: 32\n",
    "    use_padded_im_info: false\n",
    "  batch_size: 16\n",
    "  shuffle: true\n",
    "  worker_num: 2\n",
    "  use_process: false\n",
    "\n",
    "\n",
    "TestReader:\n",
    "  inputs_def:\n",
    "    # set image_shape if needed\n",
    "    fields: ['image', 'im_info', 'im_id', 'im_shape']\n",
    "  dataset:\n",
    "    !ImageFolder\n",
    "    anno_path: annotations/instances_val2017.json\n",
    "    dataset_dir: /home/aistudio/PaddleDetection/dataset/coco\n",
    "  sample_transforms:\n",
    "  - !DecodeImage\n",
    "    to_rgb: true\n",
    "    with_mixup: false\n",
    "  - !NormalizeImage\n",
    "    is_channel_first: false\n",
    "    is_scale: true\n",
    "    mean: [0.37,0.36,0.36]\n",
    "    std: [0.11, 0.10,0.10]\n",
    "  - !ResizeImage\n",
    "    interp: 1\n",
    "    max_size: 1500\n",
    "    target_size: 1000\n",
    "    use_cv2: true\n",
    "  - !Permute\n",
    "    channel_first: true\n",
    "    to_bgr: false\n",
    "  batch_transforms:\n",
    "  - !PadBatch\n",
    "    pad_to_stride: 32\n",
    "    use_padded_im_info: true\n",
    "  batch_size: 1\n",
    "  shuffle: false\n",
    "\n",
    "\n",
    "\n",
    "EvalReader:\n",
    "  inputs_def:\n",
    "    fields: ['image', 'im_info', 'im_id', 'im_shape']\n",
    "    # for voc\n",
    "    #fields: ['image', 'im_info', 'im_id', 'gt_bbox', 'gt_class', 'is_difficult']\n",
    "  dataset:\n",
    "    !COCODataSet\n",
    "    image_dir: val2017\n",
    "    anno_path: annotations/instances_val2017.json\n",
    "    dataset_dir: /home/aistudio/PaddleDetection/dataset/coco\n",
    "  sample_transforms:\n",
    "  - !DecodeImage\n",
    "    to_rgb: true\n",
    "    with_mixup: false\n",
    "  - !NormalizeImage\n",
    "    is_channel_first: false\n",
    "    is_scale: true\n",
    "    mean: [0.37,0.36,0.36]\n",
    "    std: [0.11, 0.10,0.10]\n",
    "  - !ResizeImage\n",
    "    interp: 1\n",
    "    max_size: 1500\n",
    "    target_size: 1000\n",
    "    use_cv2: true\n",
    "  - !Permute\n",
    "    channel_first: true\n",
    "    to_bgr: false\n",
    "  batch_transforms:\n",
    "  - !PadBatch\n",
    "    pad_to_stride: 32\n",
    "    use_padded_im_info: true\n",
    "  batch_size: 1\n",
    "  shuffle: false\n",
    "  drop_empty: false\n",
    "  worker_num: 2\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: CUDA_VISIBLE_DEVICES=0\n"
     ]
    }
   ],
   "source": [
    "%set_env CUDA_VISIBLE_DEVICES=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: FLAGS_fraction_of_gpu_memory_to_use=0.98\n"
     ]
    }
   ],
   "source": [
    "%set_env FLAGS_fraction_of_gpu_memory_to_use=0.98"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/aistudio/work/PaddleDetection\n"
     ]
    }
   ],
   "source": [
    "%cd /home/aistudio/work/PaddleDetection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# 训练时间比较长，这里演示到60000多轮\n",
    "%run tools/train.py -c configs/efficientdet_d0.yml --eval"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-12 00:53:31,511-INFO: places would be ommited when DataLoader is not iterable\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.01s)\n",
      "creating index...\n",
      "index created!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-12 00:53:33,829-WARNING: /home/aistudio/.cache/paddle/weights/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]\n",
      "2020-06-12 00:53:33,829-WARNING: /home/aistudio/.cache/paddle/weights/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]\n",
      "2020-06-12 00:53:34,298-WARNING: variable bbox_pred_3_b not used\n",
      "2020-06-12 00:53:34,299-WARNING: variable cls_score_3_w not used\n",
      "2020-06-12 00:53:34,299-WARNING: variable cls_score_b not used\n",
      "2020-06-12 00:53:34,300-WARNING: variable cls_score_3_b not used\n",
      "2020-06-12 00:53:34,300-WARNING: variable cls_score_2_w not used\n",
      "2020-06-12 00:53:34,301-WARNING: variable bbox_pred_b not used\n",
      "2020-06-12 00:53:34,301-WARNING: variable cls_score_2_b not used\n",
      "2020-06-12 00:53:34,302-WARNING: variable bbox_pred_w not used\n",
      "2020-06-12 00:53:34,302-WARNING: variable cls_score_w not used\n",
      "2020-06-12 00:53:34,303-WARNING: variable bbox_pred_3_w not used\n",
      "2020-06-12 00:53:34,303-WARNING: variable bbox_pred_2_w not used\n",
      "2020-06-12 00:53:34,303-WARNING: variable bbox_pred_2_b not used\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.15s)\n",
      "creating index...\n",
      "index created!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-12 00:53:34,774-INFO: places would be ommited when DataLoader is not iterable\n",
      "2020-06-12 00:53:41,892-INFO: iter: 0, lr: 0.000025, 'loss_cls_0': '3.181895', 'loss_loc_0': '0.063791', 'loss_cls_1': '1.590563', 'loss_loc_1': '0.018472', 'loss_cls_2': '0.765304', 'loss_loc_2': '0.000000', 'loss_rpn_cls': '0.832550', 'loss_rpn_bbox': '0.277769', 'loss': '6.730345', time: 0.000, eta: 0:00:08\n",
      "2020-06-12 01:01:21,904-INFO: iter: 200, lr: 0.000070, 'loss_cls_0': '0.206687', 'loss_loc_0': '0.038784', 'loss_cls_1': '0.033679', 'loss_loc_1': '0.014171', 'loss_cls_2': '0.004816', 'loss_loc_2': '0.000749', 'loss_rpn_cls': '0.283969', 'loss_rpn_bbox': '0.185311', 'loss': '0.804258', time: 2.328, eta: 7 days, 6:28:13\n",
      "2020-06-12 01:08:54,839-INFO: iter: 400, lr: 0.000115, 'loss_cls_0': '0.221177', 'loss_loc_0': '0.092147', 'loss_cls_1': '0.036958', 'loss_loc_1': '0.033115', 'loss_cls_2': '0.003597', 'loss_loc_2': '0.001932', 'loss_rpn_cls': '0.148138', 'loss_rpn_bbox': '0.128645', 'loss': '0.675907', time: 2.257, eta: 7 days, 1:01:42\n",
      "2020-06-12 01:16:25,438-INFO: iter: 600, lr: 0.000160, 'loss_cls_0': '0.236300', 'loss_loc_0': '0.120986', 'loss_cls_1': '0.043357', 'loss_loc_1': '0.045303', 'loss_cls_2': '0.004528', 'loss_loc_2': '0.003700', 'loss_rpn_cls': '0.118519', 'loss_rpn_bbox': '0.116925', 'loss': '0.721214', time: 2.254, eta: 7 days, 0:41:23\n",
      "2020-06-12 01:23:57,908-INFO: iter: 800, lr: 0.000205, 'loss_cls_0': '0.247387', 'loss_loc_0': '0.145875', 'loss_cls_1': '0.051162', 'loss_loc_1': '0.058496', 'loss_cls_2': '0.006109', 'loss_loc_2': '0.005202', 'loss_rpn_cls': '0.101538', 'loss_rpn_bbox': '0.100045', 'loss': '0.708356', time: 2.267, eta: 7 days, 1:29:28\n",
      "2020-06-12 01:31:26,097-INFO: iter: 1000, lr: 0.000250, 'loss_cls_0': '0.241730', 'loss_loc_0': '0.150212', 'loss_cls_1': '0.052301', 'loss_loc_1': '0.061880', 'loss_cls_2': '0.006885', 'loss_loc_2': '0.006563', 'loss_rpn_cls': '0.090218', 'loss_rpn_bbox': '0.094036', 'loss': '0.720213', time: 2.243, eta: 6 days, 23:36:21\n",
      "2020-06-12 01:38:46,544-INFO: iter: 1200, lr: 0.000250, 'loss_cls_0': '0.253788', 'loss_loc_0': '0.166063', 'loss_cls_1': '0.060991', 'loss_loc_1': '0.076070', 'loss_cls_2': '0.009198', 'loss_loc_2': '0.009527', 'loss_rpn_cls': '0.079944', 'loss_rpn_bbox': '0.092881', 'loss': '0.761535', time: 2.199, eta: 6 days, 20:10:45\n",
      "2020-06-12 01:46:19,155-INFO: iter: 1400, lr: 0.000250, 'loss_cls_0': '0.247907', 'loss_loc_0': '0.160112', 'loss_cls_1': '0.063426', 'loss_loc_1': '0.080890', 'loss_cls_2': '0.011009', 'loss_loc_2': '0.012441', 'loss_rpn_cls': '0.077451', 'loss_rpn_bbox': '0.085696', 'loss': '0.753099', time: 2.266, eta: 7 days, 1:06:06\n",
      "2020-06-12 01:53:56,457-INFO: iter: 1600, lr: 0.000250, 'loss_cls_0': '0.249788', 'loss_loc_0': '0.167336', 'loss_cls_1': '0.076265', 'loss_loc_1': '0.108049', 'loss_cls_2': '0.016392', 'loss_loc_2': '0.019394', 'loss_rpn_cls': '0.069153', 'loss_rpn_bbox': '0.085025', 'loss': '0.797102', time: 2.279, eta: 7 days, 1:56:20\n",
      "2020-06-12 02:01:39,362-INFO: iter: 1800, lr: 0.000250, 'loss_cls_0': '0.247805', 'loss_loc_0': '0.161118', 'loss_cls_1': '0.083001', 'loss_loc_1': '0.119405', 'loss_cls_2': '0.020428', 'loss_loc_2': '0.026627', 'loss_rpn_cls': '0.069207', 'loss_rpn_bbox': '0.080401', 'loss': '0.814587', time: 2.314, eta: 7 days, 4:25:18\n",
      "2020-06-12 02:09:23,446-INFO: iter: 2000, lr: 0.000250, 'loss_cls_0': '0.252744', 'loss_loc_0': '0.163432', 'loss_cls_1': '0.091630', 'loss_loc_1': '0.133334', 'loss_cls_2': '0.023464', 'loss_loc_2': '0.032848', 'loss_rpn_cls': '0.064298', 'loss_rpn_bbox': '0.080971', 'loss': '0.856663', time: 2.328, eta: 7 days, 5:16:53\n",
      "2020-06-12 02:17:05,946-INFO: iter: 2200, lr: 0.000250, 'loss_cls_0': '0.238955', 'loss_loc_0': '0.154541', 'loss_cls_1': '0.090770', 'loss_loc_1': '0.140689', 'loss_cls_2': '0.026108', 'loss_loc_2': '0.039767', 'loss_rpn_cls': '0.057113', 'loss_rpn_bbox': '0.073640', 'loss': '0.838861', time: 2.308, eta: 7 days, 3:41:24\n",
      "2020-06-12 02:24:36,970-INFO: iter: 2400, lr: 0.000250, 'loss_cls_0': '0.243565', 'loss_loc_0': '0.161100', 'loss_cls_1': '0.096703', 'loss_loc_1': '0.147389', 'loss_cls_2': '0.030169', 'loss_loc_2': '0.047168', 'loss_rpn_cls': '0.062601', 'loss_rpn_bbox': '0.078263', 'loss': '0.890217', time: 2.252, eta: 6 days, 23:26:02\n",
      "2020-06-12 02:32:01,396-INFO: iter: 2600, lr: 0.000250, 'loss_cls_0': '0.245351', 'loss_loc_0': '0.161221', 'loss_cls_1': '0.099485', 'loss_loc_1': '0.155757', 'loss_cls_2': '0.031940', 'loss_loc_2': '0.051420', 'loss_rpn_cls': '0.058445', 'loss_rpn_bbox': '0.075019', 'loss': '0.888513', time: 2.221, eta: 6 days, 20:59:29\n",
      "2020-06-12 02:39:37,712-INFO: iter: 2800, lr: 0.000250, 'loss_cls_0': '0.234817', 'loss_loc_0': '0.155001', 'loss_cls_1': '0.094525', 'loss_loc_1': '0.150263', 'loss_cls_2': '0.031279', 'loss_loc_2': '0.051413', 'loss_rpn_cls': '0.059505', 'loss_rpn_bbox': '0.076148', 'loss': '0.865276', time: 2.282, eta: 7 days, 1:24:03\n",
      "2020-06-12 02:47:15,339-INFO: iter: 3000, lr: 0.000250, 'loss_cls_0': '0.236374', 'loss_loc_0': '0.162906', 'loss_cls_1': '0.100002', 'loss_loc_1': '0.156573', 'loss_cls_2': '0.034694', 'loss_loc_2': '0.056976', 'loss_rpn_cls': '0.057756', 'loss_rpn_bbox': '0.069640', 'loss': '0.876024', time: 2.294, eta: 7 days, 2:07:03\n",
      "2020-06-12 02:54:44,975-INFO: iter: 3200, lr: 0.000250, 'loss_cls_0': '0.235968', 'loss_loc_0': '0.164490', 'loss_cls_1': '0.104432', 'loss_loc_1': '0.167692', 'loss_cls_2': '0.037162', 'loss_loc_2': '0.062843', 'loss_rpn_cls': '0.052492', 'loss_rpn_bbox': '0.074195', 'loss': '0.894038', time: 2.246, eta: 6 days, 22:26:45\n",
      "2020-06-12 03:02:07,812-INFO: iter: 3400, lr: 0.000250, 'loss_cls_0': '0.231901', 'loss_loc_0': '0.156670', 'loss_cls_1': '0.096312', 'loss_loc_1': '0.157473', 'loss_cls_2': '0.035164', 'loss_loc_2': '0.062824', 'loss_rpn_cls': '0.052379', 'loss_rpn_bbox': '0.074136', 'loss': '0.877437', time: 2.210, eta: 6 days, 19:40:21\n",
      "2020-06-12 03:09:42,262-INFO: iter: 3600, lr: 0.000250, 'loss_cls_0': '0.225502', 'loss_loc_0': '0.155657', 'loss_cls_1': '0.093884', 'loss_loc_1': '0.159134', 'loss_cls_2': '0.033418', 'loss_loc_2': '0.062433', 'loss_rpn_cls': '0.052058', 'loss_rpn_bbox': '0.068881', 'loss': '0.868855', time: 2.280, eta: 7 days, 0:44:12\n",
      "2020-06-12 03:17:34,380-INFO: iter: 3800, lr: 0.000250, 'loss_cls_0': '0.229933', 'loss_loc_0': '0.162988', 'loss_cls_1': '0.100378', 'loss_loc_1': '0.169262', 'loss_cls_2': '0.035987', 'loss_loc_2': '0.069793', 'loss_rpn_cls': '0.049718', 'loss_rpn_bbox': '0.070795', 'loss': '0.900209', time: 2.359, eta: 7 days, 6:27:42\n",
      "2020-06-12 03:25:28,633-INFO: iter: 4000, lr: 0.000250, 'loss_cls_0': '0.228462', 'loss_loc_0': '0.161018', 'loss_cls_1': '0.100936', 'loss_loc_1': '0.166683', 'loss_cls_2': '0.037391', 'loss_loc_2': '0.067954', 'loss_rpn_cls': '0.046818', 'loss_rpn_bbox': '0.068851', 'loss': '0.897698', time: 2.372, eta: 7 days, 7:14:07\n",
      "2020-06-12 03:33:08,333-INFO: iter: 4200, lr: 0.000250, 'loss_cls_0': '0.221262', 'loss_loc_0': '0.157084', 'loss_cls_1': '0.098441', 'loss_loc_1': '0.168369', 'loss_cls_2': '0.037970', 'loss_loc_2': '0.071069', 'loss_rpn_cls': '0.047043', 'loss_rpn_bbox': '0.070256', 'loss': '0.895751', time: 2.296, eta: 7 days, 1:29:23\n",
      "2020-06-12 03:40:47,707-INFO: iter: 4400, lr: 0.000250, 'loss_cls_0': '0.222809', 'loss_loc_0': '0.158121', 'loss_cls_1': '0.100883', 'loss_loc_1': '0.175011', 'loss_cls_2': '0.038299', 'loss_loc_2': '0.074530', 'loss_rpn_cls': '0.043776', 'loss_rpn_bbox': '0.067259', 'loss': '0.893353', time: 2.295, eta: 7 days, 1:20:40\n",
      "2020-06-12 03:48:28,949-INFO: iter: 4600, lr: 0.000250, 'loss_cls_0': '0.222292', 'loss_loc_0': '0.156673', 'loss_cls_1': '0.099150', 'loss_loc_1': '0.171960', 'loss_cls_2': '0.038230', 'loss_loc_2': '0.072887', 'loss_rpn_cls': '0.047608', 'loss_rpn_bbox': '0.069420', 'loss': '0.894111', time: 2.312, eta: 7 days, 2:25:33\n",
      "2020-06-12 03:55:56,090-INFO: iter: 4800, lr: 0.000250, 'loss_cls_0': '0.220152', 'loss_loc_0': '0.160353', 'loss_cls_1': '0.104054', 'loss_loc_1': '0.177028', 'loss_cls_2': '0.041491', 'loss_loc_2': '0.079623', 'loss_rpn_cls': '0.042840', 'loss_rpn_bbox': '0.065350', 'loss': '0.919400', time: 2.233, eta: 6 days, 20:31:06\n",
      "2020-06-12 04:03:29,442-INFO: iter: 5000, lr: 0.000250, 'loss_cls_0': '0.223238', 'loss_loc_0': '0.162308', 'loss_cls_1': '0.104448', 'loss_loc_1': '0.180603', 'loss_cls_2': '0.041251', 'loss_loc_2': '0.082513', 'loss_rpn_cls': '0.042482', 'loss_rpn_bbox': '0.068230', 'loss': '0.909791', time: 2.269, eta: 6 days, 23:01:31\n",
      "2020-06-12 04:10:40,688-INFO: iter: 5200, lr: 0.000250, 'loss_cls_0': '0.220584', 'loss_loc_0': '0.155355', 'loss_cls_1': '0.102458', 'loss_loc_1': '0.176654', 'loss_cls_2': '0.041405', 'loss_loc_2': '0.082300', 'loss_rpn_cls': '0.046108', 'loss_rpn_bbox': '0.066070', 'loss': '0.920735', time: 2.156, eta: 6 days, 14:36:11\n",
      "2020-06-12 04:18:06,789-INFO: iter: 5400, lr: 0.000250, 'loss_cls_0': '0.217792', 'loss_loc_0': '0.155176', 'loss_cls_1': '0.101925', 'loss_loc_1': '0.173394', 'loss_cls_2': '0.040647', 'loss_loc_2': '0.084471', 'loss_rpn_cls': '0.042542', 'loss_rpn_bbox': '0.064944', 'loss': '0.897644', time: 2.223, eta: 6 days, 19:24:21\n",
      "2020-06-12 04:25:43,844-INFO: iter: 5600, lr: 0.000250, 'loss_cls_0': '0.216209', 'loss_loc_0': '0.155771', 'loss_cls_1': '0.103099', 'loss_loc_1': '0.181692', 'loss_cls_2': '0.041925', 'loss_loc_2': '0.086307', 'loss_rpn_cls': '0.041304', 'loss_rpn_bbox': '0.065040', 'loss': '0.902412', time: 2.282, eta: 6 days, 23:35:01\n",
      "2020-06-12 04:33:32,987-INFO: iter: 5800, lr: 0.000250, 'loss_cls_0': '0.219304', 'loss_loc_0': '0.156970', 'loss_cls_1': '0.101527', 'loss_loc_1': '0.182193', 'loss_cls_2': '0.040594', 'loss_loc_2': '0.082145', 'loss_rpn_cls': '0.042905', 'loss_rpn_bbox': '0.065793', 'loss': '0.906579', time: 2.354, eta: 7 days, 4:46:35\n",
      "2020-06-12 04:41:15,070-INFO: iter: 6000, lr: 0.000250, 'loss_cls_0': '0.214474', 'loss_loc_0': '0.156525', 'loss_cls_1': '0.105735', 'loss_loc_1': '0.183998', 'loss_cls_2': '0.042656', 'loss_loc_2': '0.086568', 'loss_rpn_cls': '0.041494', 'loss_rpn_bbox': '0.062092', 'loss': '0.909810', time: 2.307, eta: 7 days, 1:09:12\n",
      "2020-06-12 04:48:51,586-INFO: iter: 6200, lr: 0.000250, 'loss_cls_0': '0.212441', 'loss_loc_0': '0.156944', 'loss_cls_1': '0.101891', 'loss_loc_1': '0.184099', 'loss_cls_2': '0.041054', 'loss_loc_2': '0.083735', 'loss_rpn_cls': '0.041226', 'loss_rpn_bbox': '0.066185', 'loss': '0.902449', time: 2.277, eta: 6 days, 22:51:53\n",
      "2020-06-12 04:56:35,081-INFO: iter: 6400, lr: 0.000250, 'loss_cls_0': '0.221315', 'loss_loc_0': '0.159684', 'loss_cls_1': '0.109956', 'loss_loc_1': '0.188849', 'loss_cls_2': '0.045033', 'loss_loc_2': '0.090982', 'loss_rpn_cls': '0.042880', 'loss_rpn_bbox': '0.061677', 'loss': '0.922440', time: 2.322, eta: 7 days, 2:03:30\n",
      "2020-06-12 05:04:16,662-INFO: iter: 6600, lr: 0.000250, 'loss_cls_0': '0.212319', 'loss_loc_0': '0.161063', 'loss_cls_1': '0.107092', 'loss_loc_1': '0.189268', 'loss_cls_2': '0.044063', 'loss_loc_2': '0.091279', 'loss_rpn_cls': '0.037886', 'loss_rpn_bbox': '0.064817', 'loss': '0.914237', time: 2.314, eta: 7 days, 1:19:12\n",
      "2020-06-12 05:12:03,842-INFO: iter: 6800, lr: 0.000250, 'loss_cls_0': '0.213114', 'loss_loc_0': '0.157618', 'loss_cls_1': '0.102113', 'loss_loc_1': '0.186488', 'loss_cls_2': '0.044819', 'loss_loc_2': '0.093341', 'loss_rpn_cls': '0.039825', 'loss_rpn_bbox': '0.060858', 'loss': '0.903329', time: 2.336, eta: 7 days, 2:47:59\n",
      "2020-06-12 05:19:40,451-INFO: iter: 7000, lr: 0.000250, 'loss_cls_0': '0.218636', 'loss_loc_0': '0.162611', 'loss_cls_1': '0.108343', 'loss_loc_1': '0.191017', 'loss_cls_2': '0.046103', 'loss_loc_2': '0.092641', 'loss_rpn_cls': '0.038450', 'loss_rpn_bbox': '0.064684', 'loss': '0.927359', time: 2.283, eta: 6 days, 22:47:31\n",
      "2020-06-12 05:27:05,965-INFO: iter: 7200, lr: 0.000250, 'loss_cls_0': '0.212135', 'loss_loc_0': '0.162475', 'loss_cls_1': '0.105535', 'loss_loc_1': '0.198544', 'loss_cls_2': '0.044776', 'loss_loc_2': '0.098698', 'loss_rpn_cls': '0.036708', 'loss_rpn_bbox': '0.060992', 'loss': '0.941055', time: 2.222, eta: 6 days, 18:13:17\n",
      "2020-06-12 05:34:50,557-INFO: iter: 7400, lr: 0.000250, 'loss_cls_0': '0.209935', 'loss_loc_0': '0.155788', 'loss_cls_1': '0.106054', 'loss_loc_1': '0.186193', 'loss_cls_2': '0.044652', 'loss_loc_2': '0.094113', 'loss_rpn_cls': '0.036850', 'loss_rpn_bbox': '0.059861', 'loss': '0.912289', time: 2.319, eta: 7 days, 1:11:08\n",
      "2020-06-12 05:42:38,095-INFO: iter: 7600, lr: 0.000250, 'loss_cls_0': '0.209128', 'loss_loc_0': '0.157975', 'loss_cls_1': '0.101905', 'loss_loc_1': '0.190294', 'loss_cls_2': '0.044310', 'loss_loc_2': '0.094331', 'loss_rpn_cls': '0.040166', 'loss_rpn_bbox': '0.060685', 'loss': '0.908759', time: 2.346, eta: 7 days, 3:01:25\n",
      "2020-06-12 05:50:17,078-INFO: iter: 7800, lr: 0.000250, 'loss_cls_0': '0.211471', 'loss_loc_0': '0.161597', 'loss_cls_1': '0.107611', 'loss_loc_1': '0.202586', 'loss_cls_2': '0.045584', 'loss_loc_2': '0.100784', 'loss_rpn_cls': '0.037800', 'loss_rpn_bbox': '0.059668', 'loss': '0.936943', time: 2.295, eta: 6 days, 23:10:06\n",
      "2020-06-12 05:58:08,707-INFO: iter: 8000, lr: 0.000250, 'loss_cls_0': '0.203188', 'loss_loc_0': '0.155365', 'loss_cls_1': '0.101622', 'loss_loc_1': '0.190386', 'loss_cls_2': '0.044053', 'loss_loc_2': '0.096019', 'loss_rpn_cls': '0.034911', 'loss_rpn_bbox': '0.058205', 'loss': '0.892597', time: 2.358, eta: 7 days, 3:37:17\n",
      "2020-06-12 06:05:48,392-INFO: iter: 8200, lr: 0.000250, 'loss_cls_0': '0.207813', 'loss_loc_0': '0.160245', 'loss_cls_1': '0.104982', 'loss_loc_1': '0.199374', 'loss_cls_2': '0.045751', 'loss_loc_2': '0.101869', 'loss_rpn_cls': '0.036510', 'loss_rpn_bbox': '0.059928', 'loss': '0.931903', time: 2.298, eta: 6 days, 23:08:08\n",
      "2020-06-12 06:13:29,033-INFO: iter: 8400, lr: 0.000250, 'loss_cls_0': '0.202420', 'loss_loc_0': '0.156966', 'loss_cls_1': '0.103034', 'loss_loc_1': '0.193193', 'loss_cls_2': '0.044068', 'loss_loc_2': '0.099850', 'loss_rpn_cls': '0.033767', 'loss_rpn_bbox': '0.058609', 'loss': '0.911177', time: 2.300, eta: 6 days, 23:06:32\n",
      "2020-06-12 06:21:06,707-INFO: iter: 8600, lr: 0.000250, 'loss_cls_0': '0.213296', 'loss_loc_0': '0.160439', 'loss_cls_1': '0.109014', 'loss_loc_1': '0.204564', 'loss_cls_2': '0.046611', 'loss_loc_2': '0.099495', 'loss_rpn_cls': '0.034386', 'loss_rpn_bbox': '0.059334', 'loss': '0.945235', time: 2.287, eta: 6 days, 22:03:36\n",
      "2020-06-12 06:28:40,685-INFO: iter: 8800, lr: 0.000250, 'loss_cls_0': '0.202364', 'loss_loc_0': '0.156334', 'loss_cls_1': '0.103731', 'loss_loc_1': '0.199779', 'loss_cls_2': '0.045212', 'loss_loc_2': '0.099326', 'loss_rpn_cls': '0.039464', 'loss_rpn_bbox': '0.059713', 'loss': '0.920706', time: 2.270, eta: 6 days, 20:42:32\n",
      "2020-06-12 06:36:38,208-INFO: iter: 9000, lr: 0.000250, 'loss_cls_0': '0.200566', 'loss_loc_0': '0.154654', 'loss_cls_1': '0.101775', 'loss_loc_1': '0.190163', 'loss_cls_2': '0.044790', 'loss_loc_2': '0.100311', 'loss_rpn_cls': '0.036949', 'loss_rpn_bbox': '0.058459', 'loss': '0.897223', time: 2.392, eta: 7 days, 5:24:45\n",
      "2020-06-12 06:44:25,900-INFO: iter: 9200, lr: 0.000250, 'loss_cls_0': '0.202575', 'loss_loc_0': '0.154973', 'loss_cls_1': '0.106152', 'loss_loc_1': '0.196815', 'loss_cls_2': '0.046930', 'loss_loc_2': '0.103694', 'loss_rpn_cls': '0.036168', 'loss_rpn_bbox': '0.059671', 'loss': '0.913858', time: 2.339, eta: 7 days, 1:26:58\n",
      "2020-06-12 06:52:05,254-INFO: iter: 9400, lr: 0.000250, 'loss_cls_0': '0.197697', 'loss_loc_0': '0.153968', 'loss_cls_1': '0.100728', 'loss_loc_1': '0.198364', 'loss_cls_2': '0.043478', 'loss_loc_2': '0.104961', 'loss_rpn_cls': '0.036004', 'loss_rpn_bbox': '0.055732', 'loss': '0.910731', time: 2.297, eta: 6 days, 22:15:06\n",
      "2020-06-12 06:59:40,807-INFO: iter: 9600, lr: 0.000250, 'loss_cls_0': '0.194112', 'loss_loc_0': '0.152366', 'loss_cls_1': '0.101234', 'loss_loc_1': '0.195303', 'loss_cls_2': '0.044979', 'loss_loc_2': '0.101855', 'loss_rpn_cls': '0.033767', 'loss_rpn_bbox': '0.059466', 'loss': '0.897869', time: 2.271, eta: 6 days, 20:18:06\n",
      "2020-06-12 07:07:37,357-INFO: iter: 9800, lr: 0.000250, 'loss_cls_0': '0.195298', 'loss_loc_0': '0.157259', 'loss_cls_1': '0.100137', 'loss_loc_1': '0.198974', 'loss_cls_2': '0.044385', 'loss_loc_2': '0.102524', 'loss_rpn_cls': '0.035098', 'loss_rpn_bbox': '0.057826', 'loss': '0.893918', time: 2.382, eta: 7 days, 4:09:45\n",
      "2020-06-12 07:15:28,123-INFO: iter: 10000, lr: 0.000250, 'loss_cls_0': '0.196001', 'loss_loc_0': '0.150416', 'loss_cls_1': '0.098071', 'loss_loc_1': '0.189798', 'loss_cls_2': '0.042865', 'loss_loc_2': '0.096895', 'loss_rpn_cls': '0.034835', 'loss_rpn_bbox': '0.053276', 'loss': '0.879367', time: 2.354, eta: 7 days, 2:01:52\n",
      "2020-06-12 07:23:23,108-INFO: iter: 10200, lr: 0.000250, 'loss_cls_0': '0.197144', 'loss_loc_0': '0.152736', 'loss_cls_1': '0.102115', 'loss_loc_1': '0.194303', 'loss_cls_2': '0.044660', 'loss_loc_2': '0.101754', 'loss_rpn_cls': '0.031599', 'loss_rpn_bbox': '0.056333', 'loss': '0.902808', time: 2.382, eta: 7 days, 3:52:13\n",
      "2020-06-12 07:31:13,851-INFO: iter: 10400, lr: 0.000250, 'loss_cls_0': '0.191492', 'loss_loc_0': '0.153750', 'loss_cls_1': '0.099533', 'loss_loc_1': '0.196232', 'loss_cls_2': '0.042043', 'loss_loc_2': '0.100087', 'loss_rpn_cls': '0.033845', 'loss_rpn_bbox': '0.057380', 'loss': '0.891094', time: 2.347, eta: 7 days, 1:14:30\n",
      "2020-06-12 07:39:13,861-INFO: iter: 10600, lr: 0.000250, 'loss_cls_0': '0.192175', 'loss_loc_0': '0.150909', 'loss_cls_1': '0.095104', 'loss_loc_1': '0.186985', 'loss_cls_2': '0.042130', 'loss_loc_2': '0.098531', 'loss_rpn_cls': '0.034217', 'loss_rpn_bbox': '0.057007', 'loss': '0.872546', time: 2.407, eta: 7 days, 5:24:52\n",
      "2020-06-12 07:46:55,339-INFO: iter: 10800, lr: 0.000250, 'loss_cls_0': '0.190717', 'loss_loc_0': '0.153406', 'loss_cls_1': '0.096625', 'loss_loc_1': '0.194620', 'loss_cls_2': '0.043698', 'loss_loc_2': '0.106183', 'loss_rpn_cls': '0.031577', 'loss_rpn_bbox': '0.053806', 'loss': '0.889158', time: 2.303, eta: 6 days, 21:50:49\n",
      "2020-06-12 07:54:32,458-INFO: iter: 11000, lr: 0.000250, 'loss_cls_0': '0.190506', 'loss_loc_0': '0.153040', 'loss_cls_1': '0.098726', 'loss_loc_1': '0.197605', 'loss_cls_2': '0.043206', 'loss_loc_2': '0.101766', 'loss_rpn_cls': '0.034340', 'loss_rpn_bbox': '0.057042', 'loss': '0.886975', time: 2.289, eta: 6 days, 20:42:44\n",
      "2020-06-12 08:02:08,862-INFO: iter: 11200, lr: 0.000250, 'loss_cls_0': '0.191952', 'loss_loc_0': '0.150030', 'loss_cls_1': '0.092865', 'loss_loc_1': '0.195572', 'loss_cls_2': '0.043062', 'loss_loc_2': '0.101077', 'loss_rpn_cls': '0.037151', 'loss_rpn_bbox': '0.057373', 'loss': '0.872152', time: 2.276, eta: 6 days, 19:35:56\n",
      "2020-06-12 08:09:52,318-INFO: iter: 11400, lr: 0.000250, 'loss_cls_0': '0.190651', 'loss_loc_0': '0.154297', 'loss_cls_1': '0.097162', 'loss_loc_1': '0.197589', 'loss_cls_2': '0.043154', 'loss_loc_2': '0.100492', 'loss_rpn_cls': '0.032937', 'loss_rpn_bbox': '0.054517', 'loss': '0.881919', time: 2.324, eta: 6 days, 22:54:57\n",
      "2020-06-12 08:17:38,649-INFO: iter: 11600, lr: 0.000250, 'loss_cls_0': '0.187912', 'loss_loc_0': '0.148874', 'loss_cls_1': '0.096724', 'loss_loc_1': '0.190109', 'loss_cls_2': '0.042693', 'loss_loc_2': '0.100570', 'loss_rpn_cls': '0.031285', 'loss_rpn_bbox': '0.053538', 'loss': '0.857912', time: 2.332, eta: 6 days, 23:22:48\n",
      "2020-06-12 08:25:41,790-INFO: iter: 11800, lr: 0.000250, 'loss_cls_0': '0.186862', 'loss_loc_0': '0.152316', 'loss_cls_1': '0.097172', 'loss_loc_1': '0.197369', 'loss_cls_2': '0.043258', 'loss_loc_2': '0.107290', 'loss_rpn_cls': '0.031225', 'loss_rpn_bbox': '0.053595', 'loss': '0.864162', time: 2.416, eta: 7 days, 5:15:16\n",
      "2020-06-12 08:33:49,166-INFO: iter: 12000, lr: 0.000250, 'loss_cls_0': '0.182214', 'loss_loc_0': '0.148431', 'loss_cls_1': '0.092469', 'loss_loc_1': '0.192499', 'loss_cls_2': '0.040635', 'loss_loc_2': '0.101005', 'loss_rpn_cls': '0.030751', 'loss_rpn_bbox': '0.053827', 'loss': '0.851659', time: 2.428, eta: 7 days, 5:59:56\n",
      "2020-06-12 08:41:53,708-INFO: iter: 12200, lr: 0.000250, 'loss_cls_0': '0.183299', 'loss_loc_0': '0.149547', 'loss_cls_1': '0.096005', 'loss_loc_1': '0.191232', 'loss_cls_2': '0.041529', 'loss_loc_2': '0.098813', 'loss_rpn_cls': '0.032061', 'loss_rpn_bbox': '0.054288', 'loss': '0.862547', time: 2.426, eta: 7 days, 5:45:22\n",
      "2020-06-12 08:49:39,922-INFO: iter: 12400, lr: 0.000250, 'loss_cls_0': '0.179579', 'loss_loc_0': '0.146280', 'loss_cls_1': '0.091064', 'loss_loc_1': '0.195297', 'loss_cls_2': '0.040583', 'loss_loc_2': '0.104406', 'loss_rpn_cls': '0.033524', 'loss_rpn_bbox': '0.054712', 'loss': '0.856156', time: 2.324, eta: 6 days, 22:17:00\n",
      "2020-06-12 08:57:21,839-INFO: iter: 12600, lr: 0.000250, 'loss_cls_0': '0.185004', 'loss_loc_0': '0.151879', 'loss_cls_1': '0.094826', 'loss_loc_1': '0.192749', 'loss_cls_2': '0.042208', 'loss_loc_2': '0.104401', 'loss_rpn_cls': '0.034423', 'loss_rpn_bbox': '0.052749', 'loss': '0.871524', time: 2.319, eta: 6 days, 21:46:52\n",
      "2020-06-12 09:04:58,711-INFO: iter: 12800, lr: 0.000250, 'loss_cls_0': '0.182993', 'loss_loc_0': '0.151134', 'loss_cls_1': '0.094112', 'loss_loc_1': '0.195989', 'loss_cls_2': '0.041528', 'loss_loc_2': '0.106371', 'loss_rpn_cls': '0.029612', 'loss_rpn_bbox': '0.053884', 'loss': '0.869272', time: 2.279, eta: 6 days, 18:49:37\n",
      "2020-06-12 09:12:26,860-INFO: iter: 13000, lr: 0.000250, 'loss_cls_0': '0.181372', 'loss_loc_0': '0.150849', 'loss_cls_1': '0.094070', 'loss_loc_1': '0.198524', 'loss_cls_2': '0.041847', 'loss_loc_2': '0.104627', 'loss_rpn_cls': '0.032613', 'loss_rpn_bbox': '0.056044', 'loss': '0.873174', time: 2.247, eta: 6 days, 16:22:43\n",
      "2020-06-12 09:20:16,553-INFO: iter: 13200, lr: 0.000250, 'loss_cls_0': '0.178486', 'loss_loc_0': '0.147549', 'loss_cls_1': '0.090696', 'loss_loc_1': '0.188906', 'loss_cls_2': '0.041152', 'loss_loc_2': '0.103279', 'loss_rpn_cls': '0.030482', 'loss_rpn_bbox': '0.051418', 'loss': '0.842258', time: 2.346, eta: 6 days, 23:19:50\n",
      "2020-06-12 09:27:58,762-INFO: iter: 13400, lr: 0.000250, 'loss_cls_0': '0.176949', 'loss_loc_0': '0.149004', 'loss_cls_1': '0.091210', 'loss_loc_1': '0.191158', 'loss_cls_2': '0.040464', 'loss_loc_2': '0.103063', 'loss_rpn_cls': '0.030490', 'loss_rpn_bbox': '0.050919', 'loss': '0.852225', time: 2.310, eta: 6 days, 20:41:05\n",
      "2020-06-12 09:35:42,968-INFO: iter: 13600, lr: 0.000250, 'loss_cls_0': '0.165009', 'loss_loc_0': '0.140421', 'loss_cls_1': '0.083439', 'loss_loc_1': '0.182850', 'loss_cls_2': '0.038009', 'loss_loc_2': '0.099852', 'loss_rpn_cls': '0.030548', 'loss_rpn_bbox': '0.052221', 'loss': '0.814249', time: 2.327, eta: 6 days, 21:45:05\n",
      "2020-06-12 09:43:29,334-INFO: iter: 13800, lr: 0.000250, 'loss_cls_0': '0.175278', 'loss_loc_0': '0.148588', 'loss_cls_1': '0.087559', 'loss_loc_1': '0.189050', 'loss_cls_2': '0.040697', 'loss_loc_2': '0.098803', 'loss_rpn_cls': '0.032026', 'loss_rpn_bbox': '0.052673', 'loss': '0.830984', time: 2.324, eta: 6 days, 21:24:30\n",
      "2020-06-12 09:51:15,510-INFO: iter: 14000, lr: 0.000250, 'loss_cls_0': '0.171098', 'loss_loc_0': '0.143606', 'loss_cls_1': '0.085903', 'loss_loc_1': '0.185092', 'loss_cls_2': '0.039479', 'loss_loc_2': '0.099951', 'loss_rpn_cls': '0.029525', 'loss_rpn_bbox': '0.051500', 'loss': '0.814796', time: 2.338, eta: 6 days, 22:17:12\n",
      "2020-06-12 09:58:59,094-INFO: iter: 14200, lr: 0.000250, 'loss_cls_0': '0.169335', 'loss_loc_0': '0.144445', 'loss_cls_1': '0.083754', 'loss_loc_1': '0.191545', 'loss_cls_2': '0.039267', 'loss_loc_2': '0.103750', 'loss_rpn_cls': '0.029827', 'loss_rpn_bbox': '0.048912', 'loss': '0.818663', time: 2.312, eta: 6 days, 20:17:46\n",
      "2020-06-12 10:06:54,231-INFO: iter: 14400, lr: 0.000250, 'loss_cls_0': '0.175450', 'loss_loc_0': '0.146517', 'loss_cls_1': '0.088306', 'loss_loc_1': '0.187660', 'loss_cls_2': '0.039335', 'loss_loc_2': '0.100700', 'loss_rpn_cls': '0.031114', 'loss_rpn_bbox': '0.053805', 'loss': '0.829371', time: 2.382, eta: 7 days, 1:05:17\n",
      "2020-06-12 10:14:43,231-INFO: iter: 14600, lr: 0.000250, 'loss_cls_0': '0.157389', 'loss_loc_0': '0.138792', 'loss_cls_1': '0.078911', 'loss_loc_1': '0.181029', 'loss_cls_2': '0.035785', 'loss_loc_2': '0.096864', 'loss_rpn_cls': '0.030408', 'loss_rpn_bbox': '0.051487', 'loss': '0.798049', time: 2.345, eta: 6 days, 22:21:39\n",
      "2020-06-12 10:22:20,783-INFO: iter: 14800, lr: 0.000250, 'loss_cls_0': '0.167989', 'loss_loc_0': '0.141821', 'loss_cls_1': '0.084526', 'loss_loc_1': '0.183113', 'loss_cls_2': '0.038024', 'loss_loc_2': '0.097869', 'loss_rpn_cls': '0.028891', 'loss_rpn_bbox': '0.051845', 'loss': '0.800149', time: 2.284, eta: 6 days, 17:53:13\n",
      "2020-06-12 10:29:45,901-INFO: iter: 15000, lr: 0.000250, 'loss_cls_0': '0.161258', 'loss_loc_0': '0.142941', 'loss_cls_1': '0.082626', 'loss_loc_1': '0.186066', 'loss_cls_2': '0.036390', 'loss_loc_2': '0.097019', 'loss_rpn_cls': '0.029084', 'loss_rpn_bbox': '0.052901', 'loss': '0.803197', time: 2.224, eta: 6 days, 13:31:27\n",
      "2020-06-12 10:37:30,505-INFO: iter: 15200, lr: 0.000250, 'loss_cls_0': '0.159831', 'loss_loc_0': '0.135980', 'loss_cls_1': '0.078675', 'loss_loc_1': '0.172412', 'loss_cls_2': '0.034752', 'loss_loc_2': '0.092567', 'loss_rpn_cls': '0.030826', 'loss_rpn_bbox': '0.052382', 'loss': '0.763498', time: 2.321, eta: 6 days, 20:18:26\n",
      "2020-06-12 10:45:18,617-INFO: iter: 15400, lr: 0.000250, 'loss_cls_0': '0.158806', 'loss_loc_0': '0.138375', 'loss_cls_1': '0.078724', 'loss_loc_1': '0.176415', 'loss_cls_2': '0.036501', 'loss_loc_2': '0.096249', 'loss_rpn_cls': '0.027971', 'loss_rpn_bbox': '0.054065', 'loss': '0.776234', time: 2.348, eta: 6 days, 22:01:57\n",
      "2020-06-12 10:53:08,810-INFO: iter: 15600, lr: 0.000250, 'loss_cls_0': '0.160253', 'loss_loc_0': '0.138878', 'loss_cls_1': '0.081989', 'loss_loc_1': '0.176850', 'loss_cls_2': '0.036568', 'loss_loc_2': '0.094801', 'loss_rpn_cls': '0.028488', 'loss_rpn_bbox': '0.051069', 'loss': '0.770544', time: 2.358, eta: 6 days, 22:36:57\n",
      "2020-06-12 11:00:43,619-INFO: iter: 15800, lr: 0.000250, 'loss_cls_0': '0.157975', 'loss_loc_0': '0.137708', 'loss_cls_1': '0.077419', 'loss_loc_1': '0.181981', 'loss_cls_2': '0.034718', 'loss_loc_2': '0.097166', 'loss_rpn_cls': '0.029169', 'loss_rpn_bbox': '0.051879', 'loss': '0.785273', time: 2.261, eta: 6 days, 15:37:25\n",
      "2020-06-12 11:08:40,181-INFO: iter: 16000, lr: 0.000250, 'loss_cls_0': '0.162785', 'loss_loc_0': '0.139357', 'loss_cls_1': '0.081484', 'loss_loc_1': '0.174293', 'loss_cls_2': '0.036311', 'loss_loc_2': '0.096348', 'loss_rpn_cls': '0.028964', 'loss_rpn_bbox': '0.048087', 'loss': '0.782492', time: 2.377, eta: 6 days, 23:40:51\n",
      "2020-06-12 11:17:09,630-INFO: iter: 16200, lr: 0.000250, 'loss_cls_0': '0.161881', 'loss_loc_0': '0.139397', 'loss_cls_1': '0.080748', 'loss_loc_1': '0.178179', 'loss_cls_2': '0.035656', 'loss_loc_2': '0.095977', 'loss_rpn_cls': '0.027923', 'loss_rpn_bbox': '0.050241', 'loss': '0.783051', time: 2.557, eta: 7 days, 12:18:00\n",
      "2020-06-12 11:25:41,990-INFO: iter: 16400, lr: 0.000250, 'loss_cls_0': '0.154445', 'loss_loc_0': '0.137589', 'loss_cls_1': '0.080409', 'loss_loc_1': '0.170553', 'loss_cls_2': '0.036639', 'loss_loc_2': '0.094332', 'loss_rpn_cls': '0.030235', 'loss_rpn_bbox': '0.050135', 'loss': '0.762855', time: 2.559, eta: 7 days, 12:16:08\n",
      "2020-06-12 11:34:04,451-INFO: iter: 16600, lr: 0.000250, 'loss_cls_0': '0.160951', 'loss_loc_0': '0.138358', 'loss_cls_1': '0.079748', 'loss_loc_1': '0.178748', 'loss_cls_2': '0.035291', 'loss_loc_2': '0.100582', 'loss_rpn_cls': '0.029255', 'loss_rpn_bbox': '0.049536', 'loss': '0.778476', time: 2.518, eta: 7 days, 9:13:30\n",
      "2020-06-12 11:42:16,288-INFO: iter: 16800, lr: 0.000250, 'loss_cls_0': '0.158399', 'loss_loc_0': '0.135022', 'loss_cls_1': '0.077917', 'loss_loc_1': '0.179580', 'loss_cls_2': '0.034826', 'loss_loc_2': '0.094813', 'loss_rpn_cls': '0.030147', 'loss_rpn_bbox': '0.052017', 'loss': '0.771086', time: 2.459, eta: 7 days, 4:58:31\n",
      "2020-06-12 11:49:59,242-INFO: iter: 17000, lr: 0.000250, 'loss_cls_0': '0.154998', 'loss_loc_0': '0.134778', 'loss_cls_1': '0.075390', 'loss_loc_1': '0.170361', 'loss_cls_2': '0.033689', 'loss_loc_2': '0.093104', 'loss_rpn_cls': '0.028599', 'loss_rpn_bbox': '0.049507', 'loss': '0.751366', time: 2.305, eta: 6 days, 17:58:58\n",
      "2020-06-12 11:57:46,868-INFO: iter: 17200, lr: 0.000250, 'loss_cls_0': '0.157167', 'loss_loc_0': '0.135334', 'loss_cls_1': '0.078241', 'loss_loc_1': '0.175177', 'loss_cls_2': '0.035179', 'loss_loc_2': '0.094300', 'loss_rpn_cls': '0.029074', 'loss_rpn_bbox': '0.049819', 'loss': '0.756290', time: 2.348, eta: 6 days, 20:53:35\n",
      "2020-06-12 12:05:36,201-INFO: iter: 17400, lr: 0.000250, 'loss_cls_0': '0.157079', 'loss_loc_0': '0.141807', 'loss_cls_1': '0.074333', 'loss_loc_1': '0.173851', 'loss_cls_2': '0.033783', 'loss_loc_2': '0.096081', 'loss_rpn_cls': '0.027442', 'loss_rpn_bbox': '0.050185', 'loss': '0.780110', time: 2.346, eta: 6 days, 20:38:01\n",
      "2020-06-12 12:13:13,820-INFO: iter: 17600, lr: 0.000250, 'loss_cls_0': '0.155221', 'loss_loc_0': '0.137658', 'loss_cls_1': '0.077629', 'loss_loc_1': '0.179332', 'loss_cls_2': '0.035607', 'loss_loc_2': '0.098858', 'loss_rpn_cls': '0.028715', 'loss_rpn_bbox': '0.049285', 'loss': '0.781789', time: 2.286, eta: 6 days, 16:16:40\n",
      "2020-06-12 12:20:54,007-INFO: iter: 17800, lr: 0.000250, 'loss_cls_0': '0.149351', 'loss_loc_0': '0.132777', 'loss_cls_1': '0.072955', 'loss_loc_1': '0.171485', 'loss_cls_2': '0.033348', 'loss_loc_2': '0.093005', 'loss_rpn_cls': '0.027032', 'loss_rpn_bbox': '0.050716', 'loss': '0.752720', time: 2.300, eta: 6 days, 17:08:43\n",
      "2020-06-12 12:28:42,095-INFO: iter: 18000, lr: 0.000250, 'loss_cls_0': '0.153948', 'loss_loc_0': '0.135030', 'loss_cls_1': '0.077661', 'loss_loc_1': '0.179717', 'loss_cls_2': '0.035468', 'loss_loc_2': '0.094728', 'loss_rpn_cls': '0.026339', 'loss_rpn_bbox': '0.047089', 'loss': '0.765587', time: 2.343, eta: 6 days, 19:59:54\n",
      "2020-06-12 12:36:36,261-INFO: iter: 18200, lr: 0.000250, 'loss_cls_0': '0.153477', 'loss_loc_0': '0.135509', 'loss_cls_1': '0.076071', 'loss_loc_1': '0.172352', 'loss_cls_2': '0.034508', 'loss_loc_2': '0.095784', 'loss_rpn_cls': '0.026786', 'loss_rpn_bbox': '0.050120', 'loss': '0.748536', time: 2.362, eta: 6 days, 21:11:46\n",
      "2020-06-12 12:44:15,488-INFO: iter: 18400, lr: 0.000250, 'loss_cls_0': '0.157109', 'loss_loc_0': '0.136803', 'loss_cls_1': '0.076494', 'loss_loc_1': '0.176036', 'loss_cls_2': '0.034781', 'loss_loc_2': '0.096516', 'loss_rpn_cls': '0.028647', 'loss_rpn_bbox': '0.051759', 'loss': '0.774188', time: 2.295, eta: 6 days, 16:22:14\n",
      "2020-06-12 12:51:47,463-INFO: iter: 18600, lr: 0.000250, 'loss_cls_0': '0.156167', 'loss_loc_0': '0.138519', 'loss_cls_1': '0.075852', 'loss_loc_1': '0.180436', 'loss_cls_2': '0.034758', 'loss_loc_2': '0.101568', 'loss_rpn_cls': '0.024851', 'loss_rpn_bbox': '0.047763', 'loss': '0.773135', time: 2.263, eta: 6 days, 14:02:12\n",
      "2020-06-12 12:59:31,633-INFO: iter: 18800, lr: 0.000250, 'loss_cls_0': '0.150827', 'loss_loc_0': '0.134931', 'loss_cls_1': '0.075018', 'loss_loc_1': '0.174828', 'loss_cls_2': '0.033667', 'loss_loc_2': '0.096388', 'loss_rpn_cls': '0.028464', 'loss_rpn_bbox': '0.049078', 'loss': '0.752704', time: 2.329, eta: 6 days, 18:29:32\n",
      "2020-06-12 13:07:04,540-INFO: iter: 19000, lr: 0.000250, 'loss_cls_0': '0.148006', 'loss_loc_0': '0.133541', 'loss_cls_1': '0.072569', 'loss_loc_1': '0.167253', 'loss_cls_2': '0.033268', 'loss_loc_2': '0.093293', 'loss_rpn_cls': '0.028407', 'loss_rpn_bbox': '0.050173', 'loss': '0.736187', time: 2.263, eta: 6 days, 13:45:08\n",
      "2020-06-12 13:14:40,820-INFO: iter: 19200, lr: 0.000250, 'loss_cls_0': '0.152997', 'loss_loc_0': '0.132303', 'loss_cls_1': '0.075238', 'loss_loc_1': '0.175184', 'loss_cls_2': '0.034243', 'loss_loc_2': '0.097575', 'loss_rpn_cls': '0.026509', 'loss_rpn_bbox': '0.048022', 'loss': '0.762268', time: 2.283, eta: 6 days, 15:03:40\n",
      "2020-06-12 13:22:12,145-INFO: iter: 19400, lr: 0.000250, 'loss_cls_0': '0.147981', 'loss_loc_0': '0.133830', 'loss_cls_1': '0.073904', 'loss_loc_1': '0.174193', 'loss_cls_2': '0.034819', 'loss_loc_2': '0.100632', 'loss_rpn_cls': '0.025850', 'loss_rpn_bbox': '0.045673', 'loss': '0.749131', time: 2.250, eta: 6 days, 12:38:34\n",
      "2020-06-12 13:29:40,925-INFO: iter: 19600, lr: 0.000250, 'loss_cls_0': '0.152884', 'loss_loc_0': '0.134134', 'loss_cls_1': '0.074497', 'loss_loc_1': '0.179361', 'loss_cls_2': '0.034109', 'loss_loc_2': '0.093937', 'loss_rpn_cls': '0.028511', 'loss_rpn_bbox': '0.050125', 'loss': '0.760218', time: 2.250, eta: 6 days, 12:31:47\n",
      "2020-06-12 13:37:26,969-INFO: iter: 19800, lr: 0.000250, 'loss_cls_0': '0.146402', 'loss_loc_0': '0.129872', 'loss_cls_1': '0.072952', 'loss_loc_1': '0.170447', 'loss_cls_2': '0.033325', 'loss_loc_2': '0.091015', 'loss_rpn_cls': '0.027804', 'loss_rpn_bbox': '0.046846', 'loss': '0.731105', time: 2.328, eta: 6 days, 17:49:44\n",
      "2020-06-12 13:45:16,858-INFO: iter: 20000, lr: 0.000250, 'loss_cls_0': '0.153146', 'loss_loc_0': '0.137393', 'loss_cls_1': '0.074701', 'loss_loc_1': '0.177197', 'loss_cls_2': '0.034230', 'loss_loc_2': '0.095824', 'loss_rpn_cls': '0.025078', 'loss_rpn_bbox': '0.046894', 'loss': '0.751491', time: 2.342, eta: 6 days, 18:38:42\n",
      "2020-06-12 13:53:10,018-INFO: iter: 20200, lr: 0.000250, 'loss_cls_0': '0.145478', 'loss_loc_0': '0.131388', 'loss_cls_1': '0.071098', 'loss_loc_1': '0.167382', 'loss_cls_2': '0.032907', 'loss_loc_2': '0.091108', 'loss_rpn_cls': '0.026077', 'loss_rpn_bbox': '0.048040', 'loss': '0.736364', time: 2.375, eta: 6 days, 20:47:52\n",
      "2020-06-12 14:01:03,664-INFO: iter: 20400, lr: 0.000250, 'loss_cls_0': '0.144762', 'loss_loc_0': '0.133427', 'loss_cls_1': '0.072939', 'loss_loc_1': '0.172043', 'loss_cls_2': '0.032704', 'loss_loc_2': '0.095967', 'loss_rpn_cls': '0.026231', 'loss_rpn_bbox': '0.046078', 'loss': '0.730351', time: 2.368, eta: 6 days, 20:11:48\n",
      "2020-06-12 14:09:02,512-INFO: iter: 20600, lr: 0.000250, 'loss_cls_0': '0.143798', 'loss_loc_0': '0.133392', 'loss_cls_1': '0.069329', 'loss_loc_1': '0.165965', 'loss_cls_2': '0.031525', 'loss_loc_2': '0.089335', 'loss_rpn_cls': '0.025498', 'loss_rpn_bbox': '0.048482', 'loss': '0.730070', time: 2.382, eta: 6 days, 21:01:48\n",
      "2020-06-12 14:16:42,520-INFO: iter: 20800, lr: 0.000250, 'loss_cls_0': '0.136853', 'loss_loc_0': '0.126376', 'loss_cls_1': '0.065029', 'loss_loc_1': '0.157664', 'loss_cls_2': '0.029962', 'loss_loc_2': '0.088235', 'loss_rpn_cls': '0.027029', 'loss_rpn_bbox': '0.048987', 'loss': '0.697506', time: 2.309, eta: 6 days, 15:51:57\n",
      "2020-06-12 14:24:30,607-INFO: iter: 21000, lr: 0.000250, 'loss_cls_0': '0.143867', 'loss_loc_0': '0.128105', 'loss_cls_1': '0.068788', 'loss_loc_1': '0.164927', 'loss_cls_2': '0.031524', 'loss_loc_2': '0.089096', 'loss_rpn_cls': '0.026524', 'loss_rpn_bbox': '0.046951', 'loss': '0.707880', time: 2.337, eta: 6 days, 17:38:49\n",
      "2020-06-12 14:32:22,511-INFO: iter: 21200, lr: 0.000250, 'loss_cls_0': '0.139067', 'loss_loc_0': '0.124798', 'loss_cls_1': '0.066039', 'loss_loc_1': '0.161222', 'loss_cls_2': '0.030532', 'loss_loc_2': '0.088627', 'loss_rpn_cls': '0.026159', 'loss_rpn_bbox': '0.048425', 'loss': '0.694737', time: 2.361, eta: 6 days, 19:08:27\n",
      "2020-06-12 14:40:16,282-INFO: iter: 21400, lr: 0.000250, 'loss_cls_0': '0.134961', 'loss_loc_0': '0.125967', 'loss_cls_1': '0.066222', 'loss_loc_1': '0.159495', 'loss_cls_2': '0.029128', 'loss_loc_2': '0.089008', 'loss_rpn_cls': '0.027250', 'loss_rpn_bbox': '0.047073', 'loss': '0.691244', time: 2.368, eta: 6 days, 19:31:40\n",
      "2020-06-12 14:47:53,068-INFO: iter: 21600, lr: 0.000250, 'loss_cls_0': '0.137605', 'loss_loc_0': '0.129266', 'loss_cls_1': '0.067360', 'loss_loc_1': '0.160842', 'loss_cls_2': '0.030752', 'loss_loc_2': '0.088773', 'loss_rpn_cls': '0.026259', 'loss_rpn_bbox': '0.045629', 'loss': '0.696358', time: 2.290, eta: 6 days, 13:59:02\n",
      "2020-06-12 14:55:36,927-INFO: iter: 21800, lr: 0.000250, 'loss_cls_0': '0.137468', 'loss_loc_0': '0.126915', 'loss_cls_1': '0.066045', 'loss_loc_1': '0.161647', 'loss_cls_2': '0.029961', 'loss_loc_2': '0.088434', 'loss_rpn_cls': '0.025191', 'loss_rpn_bbox': '0.044978', 'loss': '0.689955', time: 2.319, eta: 6 days, 15:53:30\n",
      "2020-06-12 15:03:26,809-INFO: iter: 22000, lr: 0.000250, 'loss_cls_0': '0.134005', 'loss_loc_0': '0.123431', 'loss_cls_1': '0.064599', 'loss_loc_1': '0.154536', 'loss_cls_2': '0.028504', 'loss_loc_2': '0.086784', 'loss_rpn_cls': '0.026790', 'loss_rpn_bbox': '0.044980', 'loss': '0.669919', time: 2.349, eta: 6 days, 17:50:35\n",
      "2020-06-12 15:11:20,217-INFO: iter: 22200, lr: 0.000250, 'loss_cls_0': '0.136440', 'loss_loc_0': '0.123388', 'loss_cls_1': '0.064755', 'loss_loc_1': '0.156783', 'loss_cls_2': '0.029609', 'loss_loc_2': '0.085834', 'loss_rpn_cls': '0.026728', 'loss_rpn_bbox': '0.050706', 'loss': '0.689588', time: 2.360, eta: 6 days, 18:27:24\n",
      "2020-06-12 15:19:11,353-INFO: iter: 22400, lr: 0.000250, 'loss_cls_0': '0.137312', 'loss_loc_0': '0.128009', 'loss_cls_1': '0.065955', 'loss_loc_1': '0.156682', 'loss_cls_2': '0.029636', 'loss_loc_2': '0.089348', 'loss_rpn_cls': '0.025480', 'loss_rpn_bbox': '0.046641', 'loss': '0.697696', time: 2.360, eta: 6 days, 18:18:51\n",
      "2020-06-12 15:27:11,343-INFO: iter: 22600, lr: 0.000250, 'loss_cls_0': '0.133473', 'loss_loc_0': '0.123250', 'loss_cls_1': '0.065184', 'loss_loc_1': '0.158432', 'loss_cls_2': '0.029540', 'loss_loc_2': '0.089221', 'loss_rpn_cls': '0.025716', 'loss_rpn_bbox': '0.045911', 'loss': '0.685903', time: 2.394, eta: 6 days, 20:30:25\n",
      "2020-06-12 15:35:17,225-INFO: iter: 22800, lr: 0.000250, 'loss_cls_0': '0.137756', 'loss_loc_0': '0.126287', 'loss_cls_1': '0.067553', 'loss_loc_1': '0.160048', 'loss_cls_2': '0.030101', 'loss_loc_2': '0.090066', 'loss_rpn_cls': '0.024782', 'loss_rpn_bbox': '0.045012', 'loss': '0.684187', time: 2.438, eta: 6 days, 23:26:34\n",
      "2020-06-12 15:43:33,655-INFO: iter: 23000, lr: 0.000250, 'loss_cls_0': '0.129326', 'loss_loc_0': '0.118839', 'loss_cls_1': '0.061686', 'loss_loc_1': '0.155110', 'loss_cls_2': '0.028127', 'loss_loc_2': '0.087586', 'loss_rpn_cls': '0.026458', 'loss_rpn_bbox': '0.047578', 'loss': '0.667186', time: 2.473, eta: 7 days, 1:40:14\n",
      "2020-06-12 15:51:53,621-INFO: iter: 23200, lr: 0.000250, 'loss_cls_0': '0.130509', 'loss_loc_0': '0.125056', 'loss_cls_1': '0.064170', 'loss_loc_1': '0.159825', 'loss_cls_2': '0.028859', 'loss_loc_2': '0.089626', 'loss_rpn_cls': '0.024431', 'loss_rpn_bbox': '0.044686', 'loss': '0.662169', time: 2.509, eta: 7 days, 3:59:48\n",
      "2020-06-12 16:00:11,750-INFO: iter: 23400, lr: 0.000250, 'loss_cls_0': '0.132463', 'loss_loc_0': '0.122325', 'loss_cls_1': '0.061936', 'loss_loc_1': '0.154755', 'loss_cls_2': '0.028492', 'loss_loc_2': '0.086526', 'loss_rpn_cls': '0.026856', 'loss_rpn_bbox': '0.045041', 'loss': '0.659643', time: 2.489, eta: 7 days, 2:29:52\n",
      "2020-06-12 16:08:36,207-INFO: iter: 23600, lr: 0.000250, 'loss_cls_0': '0.128902', 'loss_loc_0': '0.122018', 'loss_cls_1': '0.060444', 'loss_loc_1': '0.150659', 'loss_cls_2': '0.026744', 'loss_loc_2': '0.084340', 'loss_rpn_cls': '0.024449', 'loss_rpn_bbox': '0.043505', 'loss': '0.646961', time: 2.509, eta: 7 days, 3:44:07\n",
      "2020-06-12 16:17:02,464-INFO: iter: 23800, lr: 0.000250, 'loss_cls_0': '0.132390', 'loss_loc_0': '0.123650', 'loss_cls_1': '0.060460', 'loss_loc_1': '0.157446', 'loss_cls_2': '0.028258', 'loss_loc_2': '0.091805', 'loss_rpn_cls': '0.025783', 'loss_rpn_bbox': '0.047003', 'loss': '0.667876', time: 2.539, eta: 7 days, 5:38:16\n",
      "2020-06-12 16:25:18,053-INFO: iter: 24000, lr: 0.000250, 'loss_cls_0': '0.131579', 'loss_loc_0': '0.124418', 'loss_cls_1': '0.061048', 'loss_loc_1': '0.155779', 'loss_cls_2': '0.028429', 'loss_loc_2': '0.087209', 'loss_rpn_cls': '0.025641', 'loss_rpn_bbox': '0.046041', 'loss': '0.670686', time: 2.475, eta: 7 days, 1:06:38\n",
      "2020-06-12 16:33:09,616-INFO: iter: 24200, lr: 0.000250, 'loss_cls_0': '0.127644', 'loss_loc_0': '0.123474', 'loss_cls_1': '0.060720', 'loss_loc_1': '0.153619', 'loss_cls_2': '0.027250', 'loss_loc_2': '0.087245', 'loss_rpn_cls': '0.026200', 'loss_rpn_bbox': '0.047938', 'loss': '0.672304', time: 2.359, eta: 6 days, 17:04:50\n",
      "2020-06-12 16:41:06,915-INFO: iter: 24400, lr: 0.000250, 'loss_cls_0': '0.129958', 'loss_loc_0': '0.122941', 'loss_cls_1': '0.063058', 'loss_loc_1': '0.158176', 'loss_cls_2': '0.028530', 'loss_loc_2': '0.088753', 'loss_rpn_cls': '0.025509', 'loss_rpn_bbox': '0.044664', 'loss': '0.671044', time: 2.383, eta: 6 days, 18:36:20\n",
      "2020-06-12 16:49:00,979-INFO: iter: 24600, lr: 0.000250, 'loss_cls_0': '0.136152', 'loss_loc_0': '0.122938', 'loss_cls_1': '0.065441', 'loss_loc_1': '0.156224', 'loss_cls_2': '0.029815', 'loss_loc_2': '0.086856', 'loss_rpn_cls': '0.024492', 'loss_rpn_bbox': '0.045061', 'loss': '0.696564', time: 2.381, eta: 6 days, 18:17:48\n",
      "2020-06-12 16:57:04,368-INFO: iter: 24800, lr: 0.000250, 'loss_cls_0': '0.128980', 'loss_loc_0': '0.124056', 'loss_cls_1': '0.060968', 'loss_loc_1': '0.154796', 'loss_cls_2': '0.027795', 'loss_loc_2': '0.086172', 'loss_rpn_cls': '0.024573', 'loss_rpn_bbox': '0.044849', 'loss': '0.662434', time: 2.418, eta: 6 days, 20:42:39\n",
      "2020-06-12 17:04:57,111-INFO: iter: 25000, lr: 0.000250, 'loss_cls_0': '0.128715', 'loss_loc_0': '0.123384', 'loss_cls_1': '0.060016', 'loss_loc_1': '0.152735', 'loss_cls_2': '0.027517', 'loss_loc_2': '0.088823', 'loss_rpn_cls': '0.024138', 'loss_rpn_bbox': '0.044154', 'loss': '0.660054', time: 2.364, eta: 6 days, 16:51:48\n",
      "2020-06-12 17:12:46,987-INFO: iter: 25200, lr: 0.000250, 'loss_cls_0': '0.128845', 'loss_loc_0': '0.123583', 'loss_cls_1': '0.060906', 'loss_loc_1': '0.154988', 'loss_cls_2': '0.027857', 'loss_loc_2': '0.085150', 'loss_rpn_cls': '0.026794', 'loss_rpn_bbox': '0.045425', 'loss': '0.659467', time: 2.347, eta: 6 days, 15:33:56\n",
      "2020-06-12 17:20:34,422-INFO: iter: 25400, lr: 0.000250, 'loss_cls_0': '0.131844', 'loss_loc_0': '0.122911', 'loss_cls_1': '0.061250', 'loss_loc_1': '0.156792', 'loss_cls_2': '0.028502', 'loss_loc_2': '0.088856', 'loss_rpn_cls': '0.022697', 'loss_rpn_bbox': '0.045881', 'loss': '0.667243', time: 2.340, eta: 6 days, 14:59:49\n",
      "2020-06-12 17:28:24,581-INFO: iter: 25600, lr: 0.000250, 'loss_cls_0': '0.125152', 'loss_loc_0': '0.117253', 'loss_cls_1': '0.058328', 'loss_loc_1': '0.148523', 'loss_cls_2': '0.026589', 'loss_loc_2': '0.082893', 'loss_rpn_cls': '0.023129', 'loss_rpn_bbox': '0.046986', 'loss': '0.636496', time: 2.343, eta: 6 days, 15:02:56\n",
      "2020-06-12 17:36:14,627-INFO: iter: 25800, lr: 0.000250, 'loss_cls_0': '0.129181', 'loss_loc_0': '0.129232', 'loss_cls_1': '0.058520', 'loss_loc_1': '0.158143', 'loss_cls_2': '0.026936', 'loss_loc_2': '0.087186', 'loss_rpn_cls': '0.024977', 'loss_rpn_bbox': '0.042771', 'loss': '0.679191', time: 2.358, eta: 6 days, 15:55:12\n",
      "2020-06-12 17:44:00,087-INFO: iter: 26000, lr: 0.000250, 'loss_cls_0': '0.127694', 'loss_loc_0': '0.118924', 'loss_cls_1': '0.056792', 'loss_loc_1': '0.146937', 'loss_cls_2': '0.025549', 'loss_loc_2': '0.082436', 'loss_rpn_cls': '0.024961', 'loss_rpn_bbox': '0.045197', 'loss': '0.634003', time: 2.325, eta: 6 days, 13:35:50\n",
      "2020-06-12 17:51:44,887-INFO: iter: 26200, lr: 0.000250, 'loss_cls_0': '0.131894', 'loss_loc_0': '0.124546', 'loss_cls_1': '0.064405', 'loss_loc_1': '0.162280', 'loss_cls_2': '0.028301', 'loss_loc_2': '0.095326', 'loss_rpn_cls': '0.024565', 'loss_rpn_bbox': '0.044563', 'loss': '0.681592', time: 2.327, eta: 6 days, 13:34:13\n",
      "2020-06-12 18:00:04,035-INFO: iter: 26400, lr: 0.000250, 'loss_cls_0': '0.130680', 'loss_loc_0': '0.122425', 'loss_cls_1': '0.062005', 'loss_loc_1': '0.152878', 'loss_cls_2': '0.029161', 'loss_loc_2': '0.088028', 'loss_rpn_cls': '0.023373', 'loss_rpn_bbox': '0.044039', 'loss': '0.656193', time: 2.496, eta: 7 days, 0:53:18\n",
      "2020-06-12 18:08:06,855-INFO: iter: 26600, lr: 0.000250, 'loss_cls_0': '0.127114', 'loss_loc_0': '0.121083', 'loss_cls_1': '0.061064', 'loss_loc_1': '0.154588', 'loss_cls_2': '0.027191', 'loss_loc_2': '0.088389', 'loss_rpn_cls': '0.023932', 'loss_rpn_bbox': '0.044400', 'loss': '0.655558', time: 2.414, eta: 6 days, 19:12:45\n",
      "2020-06-12 18:16:13,819-INFO: iter: 26800, lr: 0.000250, 'loss_cls_0': '0.121175', 'loss_loc_0': '0.115339', 'loss_cls_1': '0.056001', 'loss_loc_1': '0.148861', 'loss_cls_2': '0.025705', 'loss_loc_2': '0.085249', 'loss_rpn_cls': '0.024206', 'loss_rpn_bbox': '0.044388', 'loss': '0.627864', time: 2.435, eta: 6 days, 20:29:08\n",
      "2020-06-12 18:24:07,149-INFO: iter: 27000, lr: 0.000250, 'loss_cls_0': '0.124142', 'loss_loc_0': '0.123117', 'loss_cls_1': '0.057496', 'loss_loc_1': '0.150000', 'loss_cls_2': '0.026450', 'loss_loc_2': '0.084833', 'loss_rpn_cls': '0.022840', 'loss_rpn_bbox': '0.042212', 'loss': '0.635378', time: 2.362, eta: 6 days, 15:27:28\n",
      "2020-06-12 18:31:52,822-INFO: iter: 27200, lr: 0.000250, 'loss_cls_0': '0.129589', 'loss_loc_0': '0.119469', 'loss_cls_1': '0.060661', 'loss_loc_1': '0.155264', 'loss_cls_2': '0.028002', 'loss_loc_2': '0.087658', 'loss_rpn_cls': '0.024565', 'loss_rpn_bbox': '0.043833', 'loss': '0.651150', time: 2.333, eta: 6 days, 13:20:15\n",
      "2020-06-12 18:39:48,987-INFO: iter: 27400, lr: 0.000250, 'loss_cls_0': '0.120980', 'loss_loc_0': '0.118421', 'loss_cls_1': '0.056583', 'loss_loc_1': '0.150833', 'loss_cls_2': '0.025485', 'loss_loc_2': '0.085879', 'loss_rpn_cls': '0.024145', 'loss_rpn_bbox': '0.042669', 'loss': '0.632332', time: 2.378, eta: 6 days, 16:14:01\n",
      "2020-06-12 18:47:45,641-INFO: iter: 27600, lr: 0.000250, 'loss_cls_0': '0.121401', 'loss_loc_0': '0.119692', 'loss_cls_1': '0.057293', 'loss_loc_1': '0.147506', 'loss_cls_2': '0.025103', 'loss_loc_2': '0.083144', 'loss_rpn_cls': '0.024416', 'loss_rpn_bbox': '0.044525', 'loss': '0.622796', time: 2.383, eta: 6 days, 16:27:00\n",
      "2020-06-12 18:55:42,620-INFO: iter: 27800, lr: 0.000250, 'loss_cls_0': '0.122674', 'loss_loc_0': '0.119447', 'loss_cls_1': '0.056922', 'loss_loc_1': '0.142991', 'loss_cls_2': '0.025843', 'loss_loc_2': '0.082639', 'loss_rpn_cls': '0.024738', 'loss_rpn_bbox': '0.044507', 'loss': '0.631551', time: 2.383, eta: 6 days, 16:18:13\n",
      "2020-06-12 19:03:25,842-INFO: iter: 28000, lr: 0.000250, 'loss_cls_0': '0.119579', 'loss_loc_0': '0.114679', 'loss_cls_1': '0.056417', 'loss_loc_1': '0.144686', 'loss_cls_2': '0.025109', 'loss_loc_2': '0.082054', 'loss_rpn_cls': '0.024226', 'loss_rpn_bbox': '0.043225', 'loss': '0.610100', time: 2.312, eta: 6 days, 11:24:47\n",
      "2020-06-12 19:11:22,461-INFO: iter: 28200, lr: 0.000250, 'loss_cls_0': '0.119403', 'loss_loc_0': '0.116652', 'loss_cls_1': '0.054398', 'loss_loc_1': '0.146983', 'loss_cls_2': '0.024916', 'loss_loc_2': '0.082714', 'loss_rpn_cls': '0.026483', 'loss_rpn_bbox': '0.044270', 'loss': '0.623132', time: 2.384, eta: 6 days, 16:05:48\n",
      "2020-06-12 19:19:27,143-INFO: iter: 28400, lr: 0.000250, 'loss_cls_0': '0.120216', 'loss_loc_0': '0.116432', 'loss_cls_1': '0.057285', 'loss_loc_1': '0.149851', 'loss_cls_2': '0.024893', 'loss_loc_2': '0.086853', 'loss_rpn_cls': '0.023055', 'loss_rpn_bbox': '0.043622', 'loss': '0.634153', time: 2.426, eta: 6 days, 18:47:35\n",
      "2020-06-12 19:27:18,063-INFO: iter: 28600, lr: 0.000250, 'loss_cls_0': '0.124319', 'loss_loc_0': '0.115683', 'loss_cls_1': '0.057406', 'loss_loc_1': '0.145950', 'loss_cls_2': '0.025485', 'loss_loc_2': '0.085402', 'loss_rpn_cls': '0.022704', 'loss_rpn_bbox': '0.041679', 'loss': '0.633048', time: 2.362, eta: 6 days, 14:21:08\n",
      "2020-06-12 19:35:07,507-INFO: iter: 28800, lr: 0.000250, 'loss_cls_0': '0.119238', 'loss_loc_0': '0.119230', 'loss_cls_1': '0.054989', 'loss_loc_1': '0.150816', 'loss_cls_2': '0.024697', 'loss_loc_2': '0.087034', 'loss_rpn_cls': '0.023703', 'loss_rpn_bbox': '0.041210', 'loss': '0.641271', time: 2.347, eta: 6 days, 13:14:04\n",
      "2020-06-12 19:43:07,184-INFO: iter: 29000, lr: 0.000250, 'loss_cls_0': '0.119883', 'loss_loc_0': '0.113622', 'loss_cls_1': '0.053878', 'loss_loc_1': '0.142707', 'loss_cls_2': '0.024032', 'loss_loc_2': '0.080021', 'loss_rpn_cls': '0.023259', 'loss_rpn_bbox': '0.041991', 'loss': '0.607261', time: 2.399, eta: 6 days, 16:35:05\n",
      "2020-06-12 19:51:08,481-INFO: iter: 29200, lr: 0.000250, 'loss_cls_0': '0.119611', 'loss_loc_0': '0.112026', 'loss_cls_1': '0.054413', 'loss_loc_1': '0.137908', 'loss_cls_2': '0.024015', 'loss_loc_2': '0.084122', 'loss_rpn_cls': '0.023162', 'loss_rpn_bbox': '0.042374', 'loss': '0.599334', time: 2.395, eta: 6 days, 16:12:26\n",
      "2020-06-12 19:59:06,513-INFO: iter: 29400, lr: 0.000250, 'loss_cls_0': '0.116523', 'loss_loc_0': '0.116775', 'loss_cls_1': '0.053440', 'loss_loc_1': '0.147907', 'loss_cls_2': '0.024295', 'loss_loc_2': '0.081928', 'loss_rpn_cls': '0.021514', 'loss_rpn_bbox': '0.040110', 'loss': '0.605688', time: 2.394, eta: 6 days, 16:00:37\n",
      "2020-06-12 20:06:55,147-INFO: iter: 29600, lr: 0.000250, 'loss_cls_0': '0.114187', 'loss_loc_0': '0.114272', 'loss_cls_1': '0.052508', 'loss_loc_1': '0.142778', 'loss_cls_2': '0.023744', 'loss_loc_2': '0.080545', 'loss_rpn_cls': '0.024340', 'loss_rpn_bbox': '0.044427', 'loss': '0.612051', time: 2.345, eta: 6 days, 12:34:45\n",
      "2020-06-12 20:14:55,026-INFO: iter: 29800, lr: 0.000250, 'loss_cls_0': '0.120323', 'loss_loc_0': '0.116212', 'loss_cls_1': '0.054626', 'loss_loc_1': '0.144340', 'loss_cls_2': '0.024843', 'loss_loc_2': '0.085096', 'loss_rpn_cls': '0.024279', 'loss_rpn_bbox': '0.041816', 'loss': '0.611852', time: 2.399, eta: 6 days, 16:03:21\n",
      "2020-06-12 20:22:57,611-INFO: iter: 30000, lr: 0.000250, 'loss_cls_0': '0.116842', 'loss_loc_0': '0.115678', 'loss_cls_1': '0.052185', 'loss_loc_1': '0.147798', 'loss_cls_2': '0.024657', 'loss_loc_2': '0.085136', 'loss_rpn_cls': '0.023195', 'loss_rpn_bbox': '0.041904', 'loss': '0.620660', time: 2.407, eta: 6 days, 16:28:59\n",
      "2020-06-12 20:22:57,612-INFO: Save model to output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/30000.\n",
      "2020-06-12 20:23:01,664-INFO: Test iter 0\n",
      "2020-06-12 20:23:10,519-INFO: Test iter 100\n",
      "2020-06-12 20:23:19,060-INFO: Test iter 200\n",
      "2020-06-12 20:23:27,536-INFO: Test iter 300\n",
      "2020-06-12 20:23:36,172-INFO: Test iter 400\n",
      "2020-06-12 20:23:43,315-INFO: Test finish iter 484\n",
      "2020-06-12 20:23:43,316-INFO: Total number of images: 484, inference time: 11.534193985236557 fps.\n",
      "2020-06-12 20:23:43,366-INFO: Start evaluate...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.01s)\n",
      "creating index...\n",
      "index created!\n",
      "Loading and preparing results...\n",
      "DONE (t=0.01s)\n",
      "creating index...\n",
      "index created!\n",
      "Running per image evaluation...\n",
      "Evaluate annotation type *bbox*\n",
      "DONE (t=0.63s).\n",
      "Accumulating evaluation results...\n",
      "DONE (t=0.26s).\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.211\n",
      " Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.427\n",
      " Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.171\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.146\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.174\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.206\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.272\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.334\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.334\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.261\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.260\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.312\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-12 20:23:44,300-INFO: Save model to output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/best_model.\n",
      "2020-06-12 20:23:47,639-INFO: Best test box ap: 0.2107633763068021, in iter: 30000\n",
      "2020-06-12 20:30:37,554-INFO: iter: 30200, lr: 0.000250, 'loss_cls_0': '0.119119', 'loss_loc_0': '0.112592', 'loss_cls_1': '0.055584', 'loss_loc_1': '0.138163', 'loss_cls_2': '0.025206', 'loss_loc_2': '0.080669', 'loss_rpn_cls': '0.022278', 'loss_rpn_bbox': '0.041797', 'loss': '0.613722', time: 2.311, eta: 6 days, 9:57:56\n",
      "2020-06-12 20:38:12,029-INFO: iter: 30400, lr: 0.000250, 'loss_cls_0': '0.118349', 'loss_loc_0': '0.116234', 'loss_cls_1': '0.054441', 'loss_loc_1': '0.145869', 'loss_cls_2': '0.025008', 'loss_loc_2': '0.085522', 'loss_rpn_cls': '0.022738', 'loss_rpn_bbox': '0.041997', 'loss': '0.616194', time: 2.273, eta: 6 days, 7:15:37\n",
      "2020-06-12 20:45:54,687-INFO: iter: 30600, lr: 0.000250, 'loss_cls_0': '0.111490', 'loss_loc_0': '0.112405', 'loss_cls_1': '0.051130', 'loss_loc_1': '0.139094', 'loss_cls_2': '0.023037', 'loss_loc_2': '0.080040', 'loss_rpn_cls': '0.023310', 'loss_rpn_bbox': '0.044674', 'loss': '0.578351', time: 2.313, eta: 6 days, 9:50:20\n",
      "2020-06-12 20:53:30,256-INFO: iter: 30800, lr: 0.000250, 'loss_cls_0': '0.110997', 'loss_loc_0': '0.110874', 'loss_cls_1': '0.050486', 'loss_loc_1': '0.138263', 'loss_cls_2': '0.022997', 'loss_loc_2': '0.077847', 'loss_rpn_cls': '0.023800', 'loss_rpn_bbox': '0.043554', 'loss': '0.597606', time: 2.276, eta: 6 days, 7:14:36\n",
      "2020-06-12 21:01:16,202-INFO: iter: 31000, lr: 0.000250, 'loss_cls_0': '0.113091', 'loss_loc_0': '0.112178', 'loss_cls_1': '0.051189', 'loss_loc_1': '0.142568', 'loss_cls_2': '0.023464', 'loss_loc_2': '0.081889', 'loss_rpn_cls': '0.022379', 'loss_rpn_bbox': '0.044134', 'loss': '0.598688', time: 2.329, eta: 6 days, 10:37:16\n",
      "2020-06-12 21:09:02,730-INFO: iter: 31200, lr: 0.000250, 'loss_cls_0': '0.113322', 'loss_loc_0': '0.108533', 'loss_cls_1': '0.051445', 'loss_loc_1': '0.138318', 'loss_cls_2': '0.022354', 'loss_loc_2': '0.078256', 'loss_rpn_cls': '0.023886', 'loss_rpn_bbox': '0.041258', 'loss': '0.595935', time: 2.330, eta: 6 days, 10:34:14\n",
      "2020-06-12 21:16:37,039-INFO: iter: 31400, lr: 0.000250, 'loss_cls_0': '0.114049', 'loss_loc_0': '0.111319', 'loss_cls_1': '0.051792', 'loss_loc_1': '0.147093', 'loss_cls_2': '0.023467', 'loss_loc_2': '0.084655', 'loss_rpn_cls': '0.021845', 'loss_rpn_bbox': '0.042186', 'loss': '0.608404', time: 2.276, eta: 6 days, 6:50:42\n",
      "2020-06-12 21:24:04,329-INFO: iter: 31600, lr: 0.000250, 'loss_cls_0': '0.111295', 'loss_loc_0': '0.109919', 'loss_cls_1': '0.050871', 'loss_loc_1': '0.142916', 'loss_cls_2': '0.023338', 'loss_loc_2': '0.081602', 'loss_rpn_cls': '0.023335', 'loss_rpn_bbox': '0.042326', 'loss': '0.605279', time: 2.237, eta: 6 days, 4:07:34\n",
      "2020-06-12 21:31:31,952-INFO: iter: 31800, lr: 0.000250, 'loss_cls_0': '0.109893', 'loss_loc_0': '0.109645', 'loss_cls_1': '0.050321', 'loss_loc_1': '0.138250', 'loss_cls_2': '0.022442', 'loss_loc_2': '0.081071', 'loss_rpn_cls': '0.022978', 'loss_rpn_bbox': '0.042248', 'loss': '0.576296', time: 2.229, eta: 6 days, 3:28:58\n",
      "2020-06-12 21:38:57,409-INFO: iter: 32000, lr: 0.000250, 'loss_cls_0': '0.112960', 'loss_loc_0': '0.112930', 'loss_cls_1': '0.050756', 'loss_loc_1': '0.137639', 'loss_cls_2': '0.022900', 'loss_loc_2': '0.080410', 'loss_rpn_cls': '0.021134', 'loss_rpn_bbox': '0.040186', 'loss': '0.593812', time: 2.223, eta: 6 days, 2:59:06\n",
      "2020-06-12 21:46:42,858-INFO: iter: 32200, lr: 0.000250, 'loss_cls_0': '0.109163', 'loss_loc_0': '0.108521', 'loss_cls_1': '0.049428', 'loss_loc_1': '0.132674', 'loss_cls_2': '0.022483', 'loss_loc_2': '0.078554', 'loss_rpn_cls': '0.021275', 'loss_rpn_bbox': '0.041160', 'loss': '0.574660', time: 2.330, eta: 6 days, 9:56:25\n",
      "2020-06-12 21:54:37,007-INFO: iter: 32400, lr: 0.000250, 'loss_cls_0': '0.112414', 'loss_loc_0': '0.110639', 'loss_cls_1': '0.050322', 'loss_loc_1': '0.138197', 'loss_cls_2': '0.022903', 'loss_loc_2': '0.075639', 'loss_rpn_cls': '0.021421', 'loss_rpn_bbox': '0.041916', 'loss': '0.597667', time: 2.373, eta: 6 days, 12:35:09\n",
      "2020-06-12 22:02:37,555-INFO: iter: 32600, lr: 0.000250, 'loss_cls_0': '0.107132', 'loss_loc_0': '0.106646', 'loss_cls_1': '0.048921', 'loss_loc_1': '0.135053', 'loss_cls_2': '0.021334', 'loss_loc_2': '0.079657', 'loss_rpn_cls': '0.021472', 'loss_rpn_bbox': '0.042674', 'loss': '0.576578', time: 2.408, eta: 6 days, 14:49:25\n",
      "2020-06-12 22:10:32,917-INFO: iter: 32800, lr: 0.000250, 'loss_cls_0': '0.108099', 'loss_loc_0': '0.106271', 'loss_cls_1': '0.048812', 'loss_loc_1': '0.134335', 'loss_cls_2': '0.022505', 'loss_loc_2': '0.077149', 'loss_rpn_cls': '0.021346', 'loss_rpn_bbox': '0.040484', 'loss': '0.568100', time: 2.371, eta: 6 days, 12:13:38\n",
      "2020-06-12 22:18:39,369-INFO: iter: 33000, lr: 0.000250, 'loss_cls_0': '0.108355', 'loss_loc_0': '0.107941', 'loss_cls_1': '0.048584', 'loss_loc_1': '0.138616', 'loss_cls_2': '0.022553', 'loss_loc_2': '0.077833', 'loss_rpn_cls': '0.022667', 'loss_rpn_bbox': '0.040429', 'loss': '0.578502', time: 2.429, eta: 6 days, 15:56:04\n",
      "2020-06-12 22:26:30,896-INFO: iter: 33200, lr: 0.000250, 'loss_cls_0': '0.111141', 'loss_loc_0': '0.110350', 'loss_cls_1': '0.048663', 'loss_loc_1': '0.135637', 'loss_cls_2': '0.021631', 'loss_loc_2': '0.080261', 'loss_rpn_cls': '0.021730', 'loss_rpn_bbox': '0.040935', 'loss': '0.578057', time: 2.365, eta: 6 days, 11:32:10\n",
      "2020-06-12 22:33:58,075-INFO: iter: 33400, lr: 0.000250, 'loss_cls_0': '0.111163', 'loss_loc_0': '0.109517', 'loss_cls_1': '0.049028', 'loss_loc_1': '0.131504', 'loss_cls_2': '0.021768', 'loss_loc_2': '0.076489', 'loss_rpn_cls': '0.023413', 'loss_rpn_bbox': '0.041404', 'loss': '0.571932', time: 2.239, eta: 6 days, 3:07:14\n",
      "2020-06-12 22:41:28,391-INFO: iter: 33600, lr: 0.000250, 'loss_cls_0': '0.109851', 'loss_loc_0': '0.109083', 'loss_cls_1': '0.050084', 'loss_loc_1': '0.138141', 'loss_cls_2': '0.022016', 'loss_loc_2': '0.080718', 'loss_rpn_cls': '0.021839', 'loss_rpn_bbox': '0.040089', 'loss': '0.575996', time: 2.245, eta: 6 days, 3:24:02\n",
      "2020-06-12 22:48:50,294-INFO: iter: 33800, lr: 0.000250, 'loss_cls_0': '0.107014', 'loss_loc_0': '0.104252', 'loss_cls_1': '0.047603', 'loss_loc_1': '0.130736', 'loss_cls_2': '0.021794', 'loss_loc_2': '0.075819', 'loss_rpn_cls': '0.021300', 'loss_rpn_bbox': '0.039264', 'loss': '0.549903', time: 2.214, eta: 6 days, 1:17:16\n",
      "2020-06-12 22:56:14,873-INFO: iter: 34000, lr: 0.000250, 'loss_cls_0': '0.108720', 'loss_loc_0': '0.108460', 'loss_cls_1': '0.049039', 'loss_loc_1': '0.136620', 'loss_cls_2': '0.022326', 'loss_loc_2': '0.079932', 'loss_rpn_cls': '0.023158', 'loss_rpn_bbox': '0.042205', 'loss': '0.583525', time: 2.225, eta: 6 days, 1:52:41\n",
      "2020-06-12 23:03:37,980-INFO: iter: 34200, lr: 0.000250, 'loss_cls_0': '0.108479', 'loss_loc_0': '0.106658', 'loss_cls_1': '0.048472', 'loss_loc_1': '0.134303', 'loss_cls_2': '0.022296', 'loss_loc_2': '0.079949', 'loss_rpn_cls': '0.023078', 'loss_rpn_bbox': '0.041648', 'loss': '0.569612', time: 2.214, eta: 6 days, 1:01:22\n",
      "2020-06-12 23:11:13,129-INFO: iter: 34400, lr: 0.000250, 'loss_cls_0': '0.107956', 'loss_loc_0': '0.108817', 'loss_cls_1': '0.046961', 'loss_loc_1': '0.134706', 'loss_cls_2': '0.021323', 'loss_loc_2': '0.080494', 'loss_rpn_cls': '0.021089', 'loss_rpn_bbox': '0.041498', 'loss': '0.562747', time: 2.278, eta: 6 days, 5:04:39\n",
      "2020-06-12 23:18:41,342-INFO: iter: 34600, lr: 0.000250, 'loss_cls_0': '0.101564', 'loss_loc_0': '0.107007', 'loss_cls_1': '0.044752', 'loss_loc_1': '0.125779', 'loss_cls_2': '0.020683', 'loss_loc_2': '0.072479', 'loss_rpn_cls': '0.022225', 'loss_rpn_bbox': '0.043141', 'loss': '0.547158', time: 2.238, eta: 6 days, 2:19:13\n",
      "2020-06-12 23:26:08,569-INFO: iter: 34800, lr: 0.000250, 'loss_cls_0': '0.107088', 'loss_loc_0': '0.107999', 'loss_cls_1': '0.049491', 'loss_loc_1': '0.133881', 'loss_cls_2': '0.022294', 'loss_loc_2': '0.077556', 'loss_rpn_cls': '0.021929', 'loss_rpn_bbox': '0.040371', 'loss': '0.576946', time: 2.239, eta: 6 days, 2:15:24\n",
      "2020-06-12 23:33:31,840-INFO: iter: 35000, lr: 0.000250, 'loss_cls_0': '0.105689', 'loss_loc_0': '0.106378', 'loss_cls_1': '0.047250', 'loss_loc_1': '0.129618', 'loss_cls_2': '0.021286', 'loss_loc_2': '0.076611', 'loss_rpn_cls': '0.023129', 'loss_rpn_bbox': '0.039502', 'loss': '0.556290', time: 2.209, eta: 6 days, 0:13:09\n",
      "2020-06-12 23:40:52,355-INFO: iter: 35200, lr: 0.000250, 'loss_cls_0': '0.108630', 'loss_loc_0': '0.107883', 'loss_cls_1': '0.047303', 'loss_loc_1': '0.134217', 'loss_cls_2': '0.021857', 'loss_loc_2': '0.077019', 'loss_rpn_cls': '0.021824', 'loss_rpn_bbox': '0.040667', 'loss': '0.566277', time: 2.210, eta: 6 days, 0:08:21\n",
      "2020-06-12 23:48:11,951-INFO: iter: 35400, lr: 0.000250, 'loss_cls_0': '0.102508', 'loss_loc_0': '0.102322', 'loss_cls_1': '0.044685', 'loss_loc_1': '0.128921', 'loss_cls_2': '0.020309', 'loss_loc_2': '0.076486', 'loss_rpn_cls': '0.021461', 'loss_rpn_bbox': '0.039436', 'loss': '0.540990', time: 2.189, eta: 5 days, 22:39:50\n",
      "2020-06-12 23:55:27,037-INFO: iter: 35600, lr: 0.000250, 'loss_cls_0': '0.102459', 'loss_loc_0': '0.102812', 'loss_cls_1': '0.045112', 'loss_loc_1': '0.129368', 'loss_cls_2': '0.020468', 'loss_loc_2': '0.076138', 'loss_rpn_cls': '0.021792', 'loss_rpn_bbox': '0.039381', 'loss': '0.546995', time: 2.175, eta: 5 days, 21:38:36\n",
      "2020-06-13 00:02:43,425-INFO: iter: 35800, lr: 0.000250, 'loss_cls_0': '0.102191', 'loss_loc_0': '0.103258', 'loss_cls_1': '0.044706', 'loss_loc_1': '0.126374', 'loss_cls_2': '0.019836', 'loss_loc_2': '0.076034', 'loss_rpn_cls': '0.022629', 'loss_rpn_bbox': '0.041759', 'loss': '0.538216', time: 2.192, eta: 5 days, 22:34:31\n",
      "2020-06-13 00:10:10,199-INFO: iter: 36000, lr: 0.000250, 'loss_cls_0': '0.103513', 'loss_loc_0': '0.104786', 'loss_cls_1': '0.045746', 'loss_loc_1': '0.129044', 'loss_cls_2': '0.019753', 'loss_loc_2': '0.077923', 'loss_rpn_cls': '0.021840', 'loss_rpn_bbox': '0.041032', 'loss': '0.549698', time: 2.234, eta: 6 days, 1:11:01\n",
      "2020-06-13 00:17:36,396-INFO: iter: 36200, lr: 0.000250, 'loss_cls_0': '0.105033', 'loss_loc_0': '0.108964', 'loss_cls_1': '0.046206', 'loss_loc_1': '0.134983', 'loss_cls_2': '0.021294', 'loss_loc_2': '0.079069', 'loss_rpn_cls': '0.020635', 'loss_rpn_bbox': '0.039539', 'loss': '0.567767', time: 2.222, eta: 6 days, 0:19:36\n",
      "2020-06-13 00:25:03,792-INFO: iter: 36400, lr: 0.000250, 'loss_cls_0': '0.102760', 'loss_loc_0': '0.101144', 'loss_cls_1': '0.045741', 'loss_loc_1': '0.129614', 'loss_cls_2': '0.021300', 'loss_loc_2': '0.077517', 'loss_rpn_cls': '0.023342', 'loss_rpn_bbox': '0.040589', 'loss': '0.551401', time: 2.239, eta: 6 days, 1:18:18\n",
      "2020-06-13 00:32:23,066-INFO: iter: 36600, lr: 0.000250, 'loss_cls_0': '0.102509', 'loss_loc_0': '0.106438', 'loss_cls_1': '0.045988', 'loss_loc_1': '0.134811', 'loss_cls_2': '0.020672', 'loss_loc_2': '0.080412', 'loss_rpn_cls': '0.021307', 'loss_rpn_bbox': '0.040888', 'loss': '0.561300', time: 2.196, eta: 5 days, 22:21:19\n",
      "2020-06-13 00:39:54,542-INFO: iter: 36800, lr: 0.000250, 'loss_cls_0': '0.102499', 'loss_loc_0': '0.101085', 'loss_cls_1': '0.046346', 'loss_loc_1': '0.126210', 'loss_cls_2': '0.021012', 'loss_loc_2': '0.077674', 'loss_rpn_cls': '0.021769', 'loss_rpn_bbox': '0.039193', 'loss': '0.544721', time: 2.256, eta: 6 days, 2:07:23\n",
      "2020-06-13 00:47:17,470-INFO: iter: 37000, lr: 0.000250, 'loss_cls_0': '0.103679', 'loss_loc_0': '0.100994', 'loss_cls_1': '0.046852', 'loss_loc_1': '0.129197', 'loss_cls_2': '0.020970', 'loss_loc_2': '0.076728', 'loss_rpn_cls': '0.020727', 'loss_rpn_bbox': '0.039519', 'loss': '0.544700', time: 2.223, eta: 5 days, 23:53:45\n",
      "2020-06-13 00:54:36,562-INFO: iter: 37200, lr: 0.000250, 'loss_cls_0': '0.100665', 'loss_loc_0': '0.104943', 'loss_cls_1': '0.044119', 'loss_loc_1': '0.128918', 'loss_cls_2': '0.019101', 'loss_loc_2': '0.076007', 'loss_rpn_cls': '0.019348', 'loss_rpn_bbox': '0.041379', 'loss': '0.535141', time: 2.188, eta: 5 days, 21:27:37\n",
      "2020-06-13 01:01:50,579-INFO: iter: 37400, lr: 0.000250, 'loss_cls_0': '0.100850', 'loss_loc_0': '0.104090', 'loss_cls_1': '0.043263', 'loss_loc_1': '0.131261', 'loss_cls_2': '0.019488', 'loss_loc_2': '0.074869', 'loss_rpn_cls': '0.020606', 'loss_rpn_bbox': '0.039717', 'loss': '0.538227', time: 2.177, eta: 5 days, 20:38:49\n",
      "2020-06-13 01:09:18,856-INFO: iter: 37600, lr: 0.000250, 'loss_cls_0': '0.098461', 'loss_loc_0': '0.098039', 'loss_cls_1': '0.042385', 'loss_loc_1': '0.121689', 'loss_cls_2': '0.019147', 'loss_loc_2': '0.071362', 'loss_rpn_cls': '0.022507', 'loss_rpn_bbox': '0.039383', 'loss': '0.520779', time: 2.235, eta: 6 days, 0:15:36\n",
      "2020-06-13 01:16:42,448-INFO: iter: 37800, lr: 0.000250, 'loss_cls_0': '0.097257', 'loss_loc_0': '0.098802', 'loss_cls_1': '0.042344', 'loss_loc_1': '0.122996', 'loss_cls_2': '0.020009', 'loss_loc_2': '0.073743', 'loss_rpn_cls': '0.019455', 'loss_rpn_bbox': '0.039422', 'loss': '0.531744', time: 2.221, eta: 5 days, 23:16:26\n",
      "2020-06-13 01:24:19,657-INFO: iter: 38000, lr: 0.000250, 'loss_cls_0': '0.098123', 'loss_loc_0': '0.102390', 'loss_cls_1': '0.043345', 'loss_loc_1': '0.123762', 'loss_cls_2': '0.019304', 'loss_loc_2': '0.073256', 'loss_rpn_cls': '0.019500', 'loss_rpn_bbox': '0.038603', 'loss': '0.535273', time: 2.291, eta: 6 days, 3:37:25\n",
      "2020-06-13 01:32:01,481-INFO: iter: 38200, lr: 0.000250, 'loss_cls_0': '0.100095', 'loss_loc_0': '0.102997', 'loss_cls_1': '0.043838', 'loss_loc_1': '0.126877', 'loss_cls_2': '0.020039', 'loss_loc_2': '0.073205', 'loss_rpn_cls': '0.019829', 'loss_rpn_bbox': '0.038314', 'loss': '0.533583', time: 2.299, eta: 6 days, 4:00:57\n",
      "2020-06-13 01:39:33,204-INFO: iter: 38400, lr: 0.000250, 'loss_cls_0': '0.096068', 'loss_loc_0': '0.095412', 'loss_cls_1': '0.041969', 'loss_loc_1': '0.118199', 'loss_cls_2': '0.019287', 'loss_loc_2': '0.069190', 'loss_rpn_cls': '0.021147', 'loss_rpn_bbox': '0.040063', 'loss': '0.515842', time: 2.264, eta: 6 days, 1:39:41\n",
      "2020-06-13 01:46:59,563-INFO: iter: 38600, lr: 0.000250, 'loss_cls_0': '0.093907', 'loss_loc_0': '0.100303', 'loss_cls_1': '0.040229', 'loss_loc_1': '0.124273', 'loss_cls_2': '0.018761', 'loss_loc_2': '0.074625', 'loss_rpn_cls': '0.019905', 'loss_rpn_bbox': '0.038589', 'loss': '0.524992', time: 2.237, eta: 5 days, 23:45:55\n",
      "2020-06-13 01:54:31,547-INFO: iter: 38800, lr: 0.000250, 'loss_cls_0': '0.099550', 'loss_loc_0': '0.103250', 'loss_cls_1': '0.042046', 'loss_loc_1': '0.129412', 'loss_cls_2': '0.019146', 'loss_loc_2': '0.075179', 'loss_rpn_cls': '0.020804', 'loss_rpn_bbox': '0.038379', 'loss': '0.543763', time: 2.256, eta: 6 days, 0:52:29\n",
      "2020-06-13 02:02:00,988-INFO: iter: 39000, lr: 0.000250, 'loss_cls_0': '0.098359', 'loss_loc_0': '0.103239', 'loss_cls_1': '0.041820', 'loss_loc_1': '0.132186', 'loss_cls_2': '0.020330', 'loss_loc_2': '0.076844', 'loss_rpn_cls': '0.020944', 'loss_rpn_bbox': '0.038005', 'loss': '0.547757', time: 2.245, eta: 6 days, 0:04:13\n",
      "2020-06-13 02:09:34,427-INFO: iter: 39200, lr: 0.000250, 'loss_cls_0': '0.095483', 'loss_loc_0': '0.099471', 'loss_cls_1': '0.042263', 'loss_loc_1': '0.123430', 'loss_cls_2': '0.019099', 'loss_loc_2': '0.073795', 'loss_rpn_cls': '0.022419', 'loss_rpn_bbox': '0.039354', 'loss': '0.533367', time: 2.273, eta: 6 days, 1:41:38\n",
      "2020-06-13 02:17:08,863-INFO: iter: 39400, lr: 0.000250, 'loss_cls_0': '0.101551', 'loss_loc_0': '0.101965', 'loss_cls_1': '0.044051', 'loss_loc_1': '0.128278', 'loss_cls_2': '0.019271', 'loss_loc_2': '0.075981', 'loss_rpn_cls': '0.020892', 'loss_rpn_bbox': '0.039506', 'loss': '0.536996', time: 2.261, eta: 6 days, 0:49:31\n",
      "2020-06-13 02:24:36,019-INFO: iter: 39600, lr: 0.000250, 'loss_cls_0': '0.096280', 'loss_loc_0': '0.098209', 'loss_cls_1': '0.042473', 'loss_loc_1': '0.121206', 'loss_cls_2': '0.018915', 'loss_loc_2': '0.071582', 'loss_rpn_cls': '0.019634', 'loss_rpn_bbox': '0.038497', 'loss': '0.521995', time: 2.246, eta: 5 days, 23:44:12\n",
      "2020-06-13 02:32:05,045-INFO: iter: 39800, lr: 0.000250, 'loss_cls_0': '0.096439', 'loss_loc_0': '0.099029', 'loss_cls_1': '0.041510', 'loss_loc_1': '0.125627', 'loss_cls_2': '0.018895', 'loss_loc_2': '0.071890', 'loss_rpn_cls': '0.021178', 'loss_rpn_bbox': '0.037968', 'loss': '0.529951', time: 2.243, eta: 5 days, 23:23:52\n",
      "2020-06-13 02:39:42,120-INFO: iter: 40000, lr: 0.000250, 'loss_cls_0': '0.096260', 'loss_loc_0': '0.102926', 'loss_cls_1': '0.040351', 'loss_loc_1': '0.125242', 'loss_cls_2': '0.018363', 'loss_loc_2': '0.075179', 'loss_rpn_cls': '0.020851', 'loss_rpn_bbox': '0.038150', 'loss': '0.521102', time: 2.289, eta: 6 days, 2:16:18\n",
      "2020-06-13 02:47:14,319-INFO: iter: 40200, lr: 0.000250, 'loss_cls_0': '0.099761', 'loss_loc_0': '0.102755', 'loss_cls_1': '0.043035', 'loss_loc_1': '0.130488', 'loss_cls_2': '0.019406', 'loss_loc_2': '0.078863', 'loss_rpn_cls': '0.021790', 'loss_rpn_bbox': '0.041204', 'loss': '0.546950', time: 2.258, eta: 6 days, 0:06:42\n",
      "2020-06-13 02:54:49,399-INFO: iter: 40400, lr: 0.000250, 'loss_cls_0': '0.092414', 'loss_loc_0': '0.099196', 'loss_cls_1': '0.039182', 'loss_loc_1': '0.129812', 'loss_cls_2': '0.018125', 'loss_loc_2': '0.073112', 'loss_rpn_cls': '0.019473', 'loss_rpn_bbox': '0.038851', 'loss': '0.516570', time: 2.273, eta: 6 days, 0:57:12\n",
      "2020-06-13 03:02:23,878-INFO: iter: 40600, lr: 0.000250, 'loss_cls_0': '0.097048', 'loss_loc_0': '0.097360', 'loss_cls_1': '0.042037', 'loss_loc_1': '0.125543', 'loss_cls_2': '0.019170', 'loss_loc_2': '0.074244', 'loss_rpn_cls': '0.020591', 'loss_rpn_bbox': '0.039285', 'loss': '0.517413', time: 2.275, eta: 6 days, 0:58:58\n",
      "2020-06-13 03:09:51,870-INFO: iter: 40800, lr: 0.000250, 'loss_cls_0': '0.096848', 'loss_loc_0': '0.099624', 'loss_cls_1': '0.041152', 'loss_loc_1': '0.127699', 'loss_cls_2': '0.019159', 'loss_loc_2': '0.077998', 'loss_rpn_cls': '0.019372', 'loss_rpn_bbox': '0.036738', 'loss': '0.523340', time: 2.237, eta: 5 days, 22:23:48\n",
      "2020-06-13 03:17:15,424-INFO: iter: 41000, lr: 0.000250, 'loss_cls_0': '0.097522', 'loss_loc_0': '0.104078', 'loss_cls_1': '0.041527', 'loss_loc_1': '0.131204', 'loss_cls_2': '0.018438', 'loss_loc_2': '0.074892', 'loss_rpn_cls': '0.021206', 'loss_rpn_bbox': '0.036425', 'loss': '0.535104', time: 2.224, eta: 5 days, 21:28:09\n",
      "2020-06-13 03:24:47,808-INFO: iter: 41200, lr: 0.000250, 'loss_cls_0': '0.093193', 'loss_loc_0': '0.098250', 'loss_cls_1': '0.040088', 'loss_loc_1': '0.124397', 'loss_cls_2': '0.017718', 'loss_loc_2': '0.072631', 'loss_rpn_cls': '0.020860', 'loss_rpn_bbox': '0.041041', 'loss': '0.508689', time: 2.263, eta: 5 days, 23:47:56\n",
      "2020-06-13 03:32:21,501-INFO: iter: 41400, lr: 0.000250, 'loss_cls_0': '0.096218', 'loss_loc_0': '0.098300', 'loss_cls_1': '0.039763', 'loss_loc_1': '0.120905', 'loss_cls_2': '0.018438', 'loss_loc_2': '0.073000', 'loss_rpn_cls': '0.020037', 'loss_rpn_bbox': '0.039397', 'loss': '0.515768', time: 2.261, eta: 5 days, 23:34:29\n",
      "2020-06-13 03:39:45,370-INFO: iter: 41600, lr: 0.000250, 'loss_cls_0': '0.093875', 'loss_loc_0': '0.099023', 'loss_cls_1': '0.039201', 'loss_loc_1': '0.122784', 'loss_cls_2': '0.018247', 'loss_loc_2': '0.075696', 'loss_rpn_cls': '0.019139', 'loss_rpn_bbox': '0.038338', 'loss': '0.515924', time: 2.214, eta: 5 days, 20:29:49\n",
      "2020-06-13 03:47:09,941-INFO: iter: 41800, lr: 0.000250, 'loss_cls_0': '0.092788', 'loss_loc_0': '0.095918', 'loss_cls_1': '0.039138', 'loss_loc_1': '0.123523', 'loss_cls_2': '0.017631', 'loss_loc_2': '0.075115', 'loss_rpn_cls': '0.020018', 'loss_rpn_bbox': '0.039260', 'loss': '0.510995', time: 2.229, eta: 5 days, 21:16:10\n",
      "2020-06-13 03:54:42,891-INFO: iter: 42000, lr: 0.000250, 'loss_cls_0': '0.092758', 'loss_loc_0': '0.097878', 'loss_cls_1': '0.039917', 'loss_loc_1': '0.121488', 'loss_cls_2': '0.018243', 'loss_loc_2': '0.074330', 'loss_rpn_cls': '0.020080', 'loss_rpn_bbox': '0.038430', 'loss': '0.512235', time: 2.260, eta: 5 days, 23:08:03\n",
      "2020-06-13 04:02:26,290-INFO: iter: 42200, lr: 0.000250, 'loss_cls_0': '0.095667', 'loss_loc_0': '0.100461', 'loss_cls_1': '0.039425', 'loss_loc_1': '0.123934', 'loss_cls_2': '0.018421', 'loss_loc_2': '0.074517', 'loss_rpn_cls': '0.021035', 'loss_rpn_bbox': '0.039613', 'loss': '0.526542', time: 2.328, eta: 6 days, 3:19:53\n",
      "2020-06-13 04:10:00,533-INFO: iter: 42400, lr: 0.000250, 'loss_cls_0': '0.092452', 'loss_loc_0': '0.100692', 'loss_cls_1': '0.038317', 'loss_loc_1': '0.121239', 'loss_cls_2': '0.017393', 'loss_loc_2': '0.072580', 'loss_rpn_cls': '0.019813', 'loss_rpn_bbox': '0.038926', 'loss': '0.509763', time: 2.271, eta: 5 days, 23:34:26\n",
      "2020-06-13 04:17:23,967-INFO: iter: 42600, lr: 0.000250, 'loss_cls_0': '0.089121', 'loss_loc_0': '0.100351', 'loss_cls_1': '0.039608', 'loss_loc_1': '0.125364', 'loss_cls_2': '0.018049', 'loss_loc_2': '0.074603', 'loss_rpn_cls': '0.019055', 'loss_rpn_bbox': '0.038877', 'loss': '0.517480', time: 2.217, eta: 5 days, 20:03:30\n",
      "2020-06-13 04:24:49,048-INFO: iter: 42800, lr: 0.000250, 'loss_cls_0': '0.090440', 'loss_loc_0': '0.093535', 'loss_cls_1': '0.037603', 'loss_loc_1': '0.114975', 'loss_cls_2': '0.017570', 'loss_loc_2': '0.071062', 'loss_rpn_cls': '0.022154', 'loss_rpn_bbox': '0.038287', 'loss': '0.489260', time: 2.226, eta: 5 days, 20:27:33\n",
      "2020-06-13 04:32:52,903-INFO: iter: 43000, lr: 0.000250, 'loss_cls_0': '0.092027', 'loss_loc_0': '0.095501', 'loss_cls_1': '0.040114', 'loss_loc_1': '0.120469', 'loss_cls_2': '0.018173', 'loss_loc_2': '0.074625', 'loss_rpn_cls': '0.021386', 'loss_rpn_bbox': '0.038358', 'loss': '0.508907', time: 2.410, eta: 6 days, 7:57:45\n",
      "2020-06-13 04:40:30,124-INFO: iter: 43200, lr: 0.000250, 'loss_cls_0': '0.092953', 'loss_loc_0': '0.097899', 'loss_cls_1': '0.038705', 'loss_loc_1': '0.125513', 'loss_cls_2': '0.017296', 'loss_loc_2': '0.072826', 'loss_rpn_cls': '0.018779', 'loss_rpn_bbox': '0.036365', 'loss': '0.511227', time: 2.292, eta: 6 days, 0:22:46\n",
      "2020-06-13 04:47:57,994-INFO: iter: 43400, lr: 0.000250, 'loss_cls_0': '0.091736', 'loss_loc_0': '0.092119', 'loss_cls_1': '0.040743', 'loss_loc_1': '0.118861', 'loss_cls_2': '0.018400', 'loss_loc_2': '0.072038', 'loss_rpn_cls': '0.019674', 'loss_rpn_bbox': '0.035698', 'loss': '0.490341', time: 2.234, eta: 5 days, 20:38:33\n",
      "2020-06-13 04:55:27,345-INFO: iter: 43600, lr: 0.000250, 'loss_cls_0': '0.092911', 'loss_loc_0': '0.094567', 'loss_cls_1': '0.038306', 'loss_loc_1': '0.118951', 'loss_cls_2': '0.017265', 'loss_loc_2': '0.070389', 'loss_rpn_cls': '0.020857', 'loss_rpn_bbox': '0.036654', 'loss': '0.489801', time: 2.247, eta: 5 days, 21:18:59\n",
      "2020-06-13 05:02:53,913-INFO: iter: 43800, lr: 0.000250, 'loss_cls_0': '0.092178', 'loss_loc_0': '0.095225', 'loss_cls_1': '0.039615', 'loss_loc_1': '0.121776', 'loss_cls_2': '0.017558', 'loss_loc_2': '0.072805', 'loss_rpn_cls': '0.020992', 'loss_rpn_bbox': '0.036924', 'loss': '0.502954', time: 2.238, eta: 5 days, 20:38:17\n",
      "2020-06-13 05:10:24,236-INFO: iter: 44000, lr: 0.000250, 'loss_cls_0': '0.089921', 'loss_loc_0': '0.094678', 'loss_cls_1': '0.038734', 'loss_loc_1': '0.119328', 'loss_cls_2': '0.017389', 'loss_loc_2': '0.071989', 'loss_rpn_cls': '0.020339', 'loss_rpn_bbox': '0.038290', 'loss': '0.501686', time: 2.254, eta: 5 days, 21:29:10\n",
      "2020-06-13 05:17:53,249-INFO: iter: 44200, lr: 0.000250, 'loss_cls_0': '0.088747', 'loss_loc_0': '0.092976', 'loss_cls_1': '0.037156', 'loss_loc_1': '0.117065', 'loss_cls_2': '0.016813', 'loss_loc_2': '0.071295', 'loss_rpn_cls': '0.022014', 'loss_rpn_bbox': '0.037046', 'loss': '0.488905', time: 2.238, eta: 5 days, 20:21:24\n",
      "2020-06-13 05:25:16,453-INFO: iter: 44400, lr: 0.000250, 'loss_cls_0': '0.090429', 'loss_loc_0': '0.091917', 'loss_cls_1': '0.036961', 'loss_loc_1': '0.115905', 'loss_cls_2': '0.016341', 'loss_loc_2': '0.072483', 'loss_rpn_cls': '0.020355', 'loss_rpn_bbox': '0.037065', 'loss': '0.485562', time: 2.216, eta: 5 days, 18:51:10\n",
      "2020-06-13 05:32:57,628-INFO: iter: 44600, lr: 0.000250, 'loss_cls_0': '0.094667', 'loss_loc_0': '0.096355', 'loss_cls_1': '0.038736', 'loss_loc_1': '0.121462', 'loss_cls_2': '0.017852', 'loss_loc_2': '0.070713', 'loss_rpn_cls': '0.020322', 'loss_rpn_bbox': '0.037178', 'loss': '0.509651', time: 2.306, eta: 6 days, 0:21:04\n",
      "2020-06-13 05:40:35,389-INFO: iter: 44800, lr: 0.000250, 'loss_cls_0': '0.088070', 'loss_loc_0': '0.096500', 'loss_cls_1': '0.037262', 'loss_loc_1': '0.128986', 'loss_cls_2': '0.017248', 'loss_loc_2': '0.078236', 'loss_rpn_cls': '0.020553', 'loss_rpn_bbox': '0.035118', 'loss': '0.508516', time: 2.297, eta: 5 days, 23:42:36\n",
      "2020-06-13 05:48:11,737-INFO: iter: 45000, lr: 0.000250, 'loss_cls_0': '0.089928', 'loss_loc_0': '0.094687', 'loss_cls_1': '0.038138', 'loss_loc_1': '0.113458', 'loss_cls_2': '0.016975', 'loss_loc_2': '0.068863', 'loss_rpn_cls': '0.020468', 'loss_rpn_bbox': '0.037700', 'loss': '0.498607', time: 2.276, eta: 5 days, 22:13:56\n",
      "2020-06-13 05:55:51,194-INFO: iter: 45200, lr: 0.000250, 'loss_cls_0': '0.090621', 'loss_loc_0': '0.096065', 'loss_cls_1': '0.038036', 'loss_loc_1': '0.123077', 'loss_cls_2': '0.017356', 'loss_loc_2': '0.073565', 'loss_rpn_cls': '0.019643', 'loss_rpn_bbox': '0.037944', 'loss': '0.508526', time: 2.297, eta: 5 days, 23:25:24\n",
      "2020-06-13 06:03:23,944-INFO: iter: 45400, lr: 0.000250, 'loss_cls_0': '0.087874', 'loss_loc_0': '0.092226', 'loss_cls_1': '0.036454', 'loss_loc_1': '0.114876', 'loss_cls_2': '0.016282', 'loss_loc_2': '0.069856', 'loss_rpn_cls': '0.019367', 'loss_rpn_bbox': '0.035393', 'loss': '0.478165', time: 2.267, eta: 5 days, 21:26:21\n",
      "2020-06-13 06:11:06,243-INFO: iter: 45600, lr: 0.000250, 'loss_cls_0': '0.091519', 'loss_loc_0': '0.091985', 'loss_cls_1': '0.037029', 'loss_loc_1': '0.113331', 'loss_cls_2': '0.016391', 'loss_loc_2': '0.068180', 'loss_rpn_cls': '0.021365', 'loss_rpn_bbox': '0.036806', 'loss': '0.486459', time: 2.310, eta: 5 days, 23:59:54\n",
      "2020-06-13 06:18:41,419-INFO: iter: 45800, lr: 0.000250, 'loss_cls_0': '0.092893', 'loss_loc_0': '0.095807', 'loss_cls_1': '0.039053', 'loss_loc_1': '0.121202', 'loss_cls_2': '0.017987', 'loss_loc_2': '0.072802', 'loss_rpn_cls': '0.019030', 'loss_rpn_bbox': '0.038935', 'loss': '0.507696', time: 2.273, eta: 5 days, 21:32:03\n",
      "2020-06-13 06:26:20,507-INFO: iter: 46000, lr: 0.000250, 'loss_cls_0': '0.087243', 'loss_loc_0': '0.091673', 'loss_cls_1': '0.036718', 'loss_loc_1': '0.113373', 'loss_cls_2': '0.016679', 'loss_loc_2': '0.068660', 'loss_rpn_cls': '0.018591', 'loss_rpn_bbox': '0.036050', 'loss': '0.481466', time: 2.303, eta: 5 days, 23:18:54\n",
      "2020-06-13 06:33:44,340-INFO: iter: 46200, lr: 0.000250, 'loss_cls_0': '0.090296', 'loss_loc_0': '0.091092', 'loss_cls_1': '0.037603', 'loss_loc_1': '0.114198', 'loss_cls_2': '0.016283', 'loss_loc_2': '0.068570', 'loss_rpn_cls': '0.019290', 'loss_rpn_bbox': '0.036299', 'loss': '0.483499', time: 2.212, eta: 5 days, 17:30:21\n",
      "2020-06-13 06:41:19,799-INFO: iter: 46400, lr: 0.000250, 'loss_cls_0': '0.086781', 'loss_loc_0': '0.092628', 'loss_cls_1': '0.034959', 'loss_loc_1': '0.115558', 'loss_cls_2': '0.016355', 'loss_loc_2': '0.073139', 'loss_rpn_cls': '0.019340', 'loss_rpn_bbox': '0.035861', 'loss': '0.483331', time: 2.283, eta: 5 days, 21:47:27\n",
      "2020-06-13 06:49:08,731-INFO: iter: 46600, lr: 0.000250, 'loss_cls_0': '0.085190', 'loss_loc_0': '0.093114', 'loss_cls_1': '0.034182', 'loss_loc_1': '0.112971', 'loss_cls_2': '0.015709', 'loss_loc_2': '0.068077', 'loss_rpn_cls': '0.019272', 'loss_rpn_bbox': '0.035024', 'loss': '0.469114', time: 2.342, eta: 6 days, 1:18:34\n",
      "2020-06-13 06:56:45,837-INFO: iter: 46800, lr: 0.000250, 'loss_cls_0': '0.091121', 'loss_loc_0': '0.095086', 'loss_cls_1': '0.038144', 'loss_loc_1': '0.118865', 'loss_cls_2': '0.016666', 'loss_loc_2': '0.072460', 'loss_rpn_cls': '0.019345', 'loss_rpn_bbox': '0.036039', 'loss': '0.488609', time: 2.283, eta: 5 days, 21:31:14\n",
      "2020-06-13 07:04:38,734-INFO: iter: 47000, lr: 0.000250, 'loss_cls_0': '0.083140', 'loss_loc_0': '0.089296', 'loss_cls_1': '0.035396', 'loss_loc_1': '0.112837', 'loss_cls_2': '0.015784', 'loss_loc_2': '0.065142', 'loss_rpn_cls': '0.019874', 'loss_rpn_bbox': '0.035487', 'loss': '0.456867', time: 2.369, eta: 6 days, 2:45:06\n",
      "2020-06-13 07:12:25,281-INFO: iter: 47200, lr: 0.000250, 'loss_cls_0': '0.084210', 'loss_loc_0': '0.091465', 'loss_cls_1': '0.034117', 'loss_loc_1': '0.113774', 'loss_cls_2': '0.016104', 'loss_loc_2': '0.067469', 'loss_rpn_cls': '0.021359', 'loss_rpn_bbox': '0.036304', 'loss': '0.476662', time: 2.336, eta: 6 days, 0:33:49\n",
      "2020-06-13 07:20:04,583-INFO: iter: 47400, lr: 0.000250, 'loss_cls_0': '0.084033', 'loss_loc_0': '0.090049', 'loss_cls_1': '0.034500', 'loss_loc_1': '0.110680', 'loss_cls_2': '0.015501', 'loss_loc_2': '0.069154', 'loss_rpn_cls': '0.018982', 'loss_rpn_bbox': '0.036648', 'loss': '0.474926', time: 2.294, eta: 5 days, 21:51:20\n",
      "2020-06-13 07:27:44,365-INFO: iter: 47600, lr: 0.000250, 'loss_cls_0': '0.082984', 'loss_loc_0': '0.090981', 'loss_cls_1': '0.034538', 'loss_loc_1': '0.115749', 'loss_cls_2': '0.016087', 'loss_loc_2': '0.067006', 'loss_rpn_cls': '0.019075', 'loss_rpn_bbox': '0.035404', 'loss': '0.468843', time: 2.301, eta: 5 days, 22:10:16\n",
      "2020-06-13 07:35:18,867-INFO: iter: 47800, lr: 0.000250, 'loss_cls_0': '0.084317', 'loss_loc_0': '0.089679', 'loss_cls_1': '0.034635', 'loss_loc_1': '0.115631', 'loss_cls_2': '0.016113', 'loss_loc_2': '0.069843', 'loss_rpn_cls': '0.018972', 'loss_rpn_bbox': '0.035193', 'loss': '0.473348', time: 2.262, eta: 5 days, 19:36:14\n",
      "2020-06-13 07:42:59,884-INFO: iter: 48000, lr: 0.000250, 'loss_cls_0': '0.085905', 'loss_loc_0': '0.091421', 'loss_cls_1': '0.036345', 'loss_loc_1': '0.114409', 'loss_cls_2': '0.016426', 'loss_loc_2': '0.067473', 'loss_rpn_cls': '0.018472', 'loss_rpn_bbox': '0.035028', 'loss': '0.476474', time: 2.316, eta: 5 days, 22:47:48\n",
      "2020-06-13 07:50:33,811-INFO: iter: 48200, lr: 0.000250, 'loss_cls_0': '0.088465', 'loss_loc_0': '0.093978', 'loss_cls_1': '0.034983', 'loss_loc_1': '0.116307', 'loss_cls_2': '0.015818', 'loss_loc_2': '0.071199', 'loss_rpn_cls': '0.019713', 'loss_rpn_bbox': '0.037262', 'loss': '0.489142', time: 2.264, eta: 5 days, 19:27:41\n",
      "2020-06-13 07:58:14,481-INFO: iter: 48400, lr: 0.000250, 'loss_cls_0': '0.086308', 'loss_loc_0': '0.090300', 'loss_cls_1': '0.035824', 'loss_loc_1': '0.114166', 'loss_cls_2': '0.016694', 'loss_loc_2': '0.067957', 'loss_rpn_cls': '0.019225', 'loss_rpn_bbox': '0.037315', 'loss': '0.472421', time: 2.309, eta: 5 days, 22:09:40\n",
      "2020-06-13 08:05:52,389-INFO: iter: 48600, lr: 0.000250, 'loss_cls_0': '0.087223', 'loss_loc_0': '0.091710', 'loss_cls_1': '0.035795', 'loss_loc_1': '0.119215', 'loss_cls_2': '0.016403', 'loss_loc_2': '0.073728', 'loss_rpn_cls': '0.019315', 'loss_rpn_bbox': '0.035590', 'loss': '0.496294', time: 2.289, eta: 5 days, 20:47:44\n",
      "2020-06-13 08:13:23,541-INFO: iter: 48800, lr: 0.000250, 'loss_cls_0': '0.089432', 'loss_loc_0': '0.092642', 'loss_cls_1': '0.036356', 'loss_loc_1': '0.119338', 'loss_cls_2': '0.016570', 'loss_loc_2': '0.075985', 'loss_rpn_cls': '0.020879', 'loss_rpn_bbox': '0.035652', 'loss': '0.490647', time: 2.249, eta: 5 days, 18:09:56\n",
      "2020-06-13 08:21:05,280-INFO: iter: 49000, lr: 0.000250, 'loss_cls_0': '0.087512', 'loss_loc_0': '0.091152', 'loss_cls_1': '0.035188', 'loss_loc_1': '0.115154', 'loss_cls_2': '0.016372', 'loss_loc_2': '0.069224', 'loss_rpn_cls': '0.019309', 'loss_rpn_bbox': '0.035642', 'loss': '0.482696', time: 2.314, eta: 5 days, 22:03:35\n",
      "2020-06-13 08:28:44,919-INFO: iter: 49200, lr: 0.000250, 'loss_cls_0': '0.087209', 'loss_loc_0': '0.092165', 'loss_cls_1': '0.035044', 'loss_loc_1': '0.116043', 'loss_cls_2': '0.015916', 'loss_loc_2': '0.067827', 'loss_rpn_cls': '0.019109', 'loss_rpn_bbox': '0.035337', 'loss': '0.481790', time: 2.293, eta: 5 days, 20:38:07\n",
      "2020-06-13 08:36:27,062-INFO: iter: 49400, lr: 0.000250, 'loss_cls_0': '0.084102', 'loss_loc_0': '0.088368', 'loss_cls_1': '0.035834', 'loss_loc_1': '0.109191', 'loss_cls_2': '0.015652', 'loss_loc_2': '0.066600', 'loss_rpn_cls': '0.020027', 'loss_rpn_bbox': '0.036017', 'loss': '0.461339', time: 2.312, eta: 5 days, 21:40:45\n",
      "2020-06-13 08:44:11,105-INFO: iter: 49600, lr: 0.000250, 'loss_cls_0': '0.085983', 'loss_loc_0': '0.092601', 'loss_cls_1': '0.035754', 'loss_loc_1': '0.116375', 'loss_cls_2': '0.015711', 'loss_loc_2': '0.070601', 'loss_rpn_cls': '0.020590', 'loss_rpn_bbox': '0.036820', 'loss': '0.482688', time: 2.316, eta: 5 days, 21:47:25\n",
      "2020-06-13 08:51:53,908-INFO: iter: 49800, lr: 0.000250, 'loss_cls_0': '0.086344', 'loss_loc_0': '0.088815', 'loss_cls_1': '0.035461', 'loss_loc_1': '0.117782', 'loss_cls_2': '0.016400', 'loss_loc_2': '0.074146', 'loss_rpn_cls': '0.019565', 'loss_rpn_bbox': '0.034900', 'loss': '0.477533', time: 2.322, eta: 5 days, 22:01:45\n",
      "2020-06-13 08:59:37,957-INFO: iter: 50000, lr: 0.000250, 'loss_cls_0': '0.087109', 'loss_loc_0': '0.090731', 'loss_cls_1': '0.036609', 'loss_loc_1': '0.113068', 'loss_cls_2': '0.016017', 'loss_loc_2': '0.067508', 'loss_rpn_cls': '0.018433', 'loss_rpn_bbox': '0.034492', 'loss': '0.469107', time: 2.322, eta: 5 days, 21:54:57\n",
      "2020-06-13 09:07:21,903-INFO: iter: 50200, lr: 0.000250, 'loss_cls_0': '0.087119', 'loss_loc_0': '0.091954', 'loss_cls_1': '0.035384', 'loss_loc_1': '0.115040', 'loss_cls_2': '0.016020', 'loss_loc_2': '0.072360', 'loss_rpn_cls': '0.019384', 'loss_rpn_bbox': '0.036841', 'loss': '0.481384', time: 2.319, eta: 5 days, 21:36:27\n",
      "2020-06-13 09:15:03,795-INFO: iter: 50400, lr: 0.000250, 'loss_cls_0': '0.085752', 'loss_loc_0': '0.089032', 'loss_cls_1': '0.035118', 'loss_loc_1': '0.114465', 'loss_cls_2': '0.015108', 'loss_loc_2': '0.068628', 'loss_rpn_cls': '0.019346', 'loss_rpn_bbox': '0.036151', 'loss': '0.478236', time: 2.304, eta: 5 days, 20:30:49\n",
      "2020-06-13 09:22:32,976-INFO: iter: 50600, lr: 0.000250, 'loss_cls_0': '0.084651', 'loss_loc_0': '0.091361', 'loss_cls_1': '0.036162', 'loss_loc_1': '0.113362', 'loss_cls_2': '0.016272', 'loss_loc_2': '0.071202', 'loss_rpn_cls': '0.017854', 'loss_rpn_bbox': '0.034018', 'loss': '0.472526', time: 2.244, eta: 5 days, 16:44:15\n",
      "2020-06-13 09:30:13,377-INFO: iter: 50800, lr: 0.000250, 'loss_cls_0': '0.083991', 'loss_loc_0': '0.088260', 'loss_cls_1': '0.035009', 'loss_loc_1': '0.112404', 'loss_cls_2': '0.015572', 'loss_loc_2': '0.070778', 'loss_rpn_cls': '0.019517', 'loss_rpn_bbox': '0.035579', 'loss': '0.461621', time: 2.301, eta: 5 days, 20:07:20\n",
      "2020-06-13 09:37:38,969-INFO: iter: 51000, lr: 0.000250, 'loss_cls_0': '0.084819', 'loss_loc_0': '0.089705', 'loss_cls_1': '0.035105', 'loss_loc_1': '0.111833', 'loss_cls_2': '0.015520', 'loss_loc_2': '0.070132', 'loss_rpn_cls': '0.017374', 'loss_rpn_bbox': '0.034115', 'loss': '0.461261', time: 2.237, eta: 5 days, 16:05:58\n",
      "2020-06-13 09:45:11,912-INFO: iter: 51200, lr: 0.000250, 'loss_cls_0': '0.084081', 'loss_loc_0': '0.087564', 'loss_cls_1': '0.035208', 'loss_loc_1': '0.109974', 'loss_cls_2': '0.016645', 'loss_loc_2': '0.070019', 'loss_rpn_cls': '0.019596', 'loss_rpn_bbox': '0.036476', 'loss': '0.466835', time: 2.263, eta: 5 days, 17:34:10\n",
      "2020-06-13 09:52:49,512-INFO: iter: 51400, lr: 0.000250, 'loss_cls_0': '0.086822', 'loss_loc_0': '0.089031', 'loss_cls_1': '0.037305', 'loss_loc_1': '0.116362', 'loss_cls_2': '0.016041', 'loss_loc_2': '0.071257', 'loss_rpn_cls': '0.017684', 'loss_rpn_bbox': '0.034850', 'loss': '0.480456', time: 2.288, eta: 5 days, 18:57:26\n",
      "2020-06-13 10:00:28,268-INFO: iter: 51600, lr: 0.000250, 'loss_cls_0': '0.087753', 'loss_loc_0': '0.089030', 'loss_cls_1': '0.036561', 'loss_loc_1': '0.114162', 'loss_cls_2': '0.016199', 'loss_loc_2': '0.069763', 'loss_rpn_cls': '0.018451', 'loss_rpn_bbox': '0.034665', 'loss': '0.475626', time: 2.290, eta: 5 days, 18:56:49\n",
      "2020-06-13 10:07:52,896-INFO: iter: 51800, lr: 0.000250, 'loss_cls_0': '0.084464', 'loss_loc_0': '0.089893', 'loss_cls_1': '0.034349', 'loss_loc_1': '0.116764', 'loss_cls_2': '0.015233', 'loss_loc_2': '0.071052', 'loss_rpn_cls': '0.017390', 'loss_rpn_bbox': '0.033522', 'loss': '0.470230', time: 2.227, eta: 5 days, 15:00:04\n",
      "2020-06-13 10:15:37,560-INFO: iter: 52000, lr: 0.000250, 'loss_cls_0': '0.085236', 'loss_loc_0': '0.087311', 'loss_cls_1': '0.034638', 'loss_loc_1': '0.111949', 'loss_cls_2': '0.015854', 'loss_loc_2': '0.066625', 'loss_rpn_cls': '0.020964', 'loss_rpn_bbox': '0.036099', 'loss': '0.464683', time: 2.323, eta: 5 days, 20:41:33\n",
      "2020-06-13 10:23:05,041-INFO: iter: 52200, lr: 0.000250, 'loss_cls_0': '0.083722', 'loss_loc_0': '0.087074', 'loss_cls_1': '0.035024', 'loss_loc_1': '0.107413', 'loss_cls_2': '0.015280', 'loss_loc_2': '0.069421', 'loss_rpn_cls': '0.017858', 'loss_rpn_bbox': '0.035482', 'loss': '0.455865', time: 2.234, eta: 5 days, 15:07:43\n",
      "2020-06-13 10:30:39,806-INFO: iter: 52400, lr: 0.000250, 'loss_cls_0': '0.080975', 'loss_loc_0': '0.089847', 'loss_cls_1': '0.032559', 'loss_loc_1': '0.110955', 'loss_cls_2': '0.015691', 'loss_loc_2': '0.071220', 'loss_rpn_cls': '0.020534', 'loss_rpn_bbox': '0.035330', 'loss': '0.467783', time: 2.278, eta: 5 days, 17:40:30\n",
      "2020-06-13 10:38:06,874-INFO: iter: 52600, lr: 0.000250, 'loss_cls_0': '0.085428', 'loss_loc_0': '0.087719', 'loss_cls_1': '0.034333', 'loss_loc_1': '0.113806', 'loss_cls_2': '0.015987', 'loss_loc_2': '0.072105', 'loss_rpn_cls': '0.018849', 'loss_rpn_bbox': '0.033250', 'loss': '0.467896', time: 2.224, eta: 5 days, 14:19:20\n",
      "2020-06-13 10:45:37,831-INFO: iter: 52800, lr: 0.000250, 'loss_cls_0': '0.082739', 'loss_loc_0': '0.092059', 'loss_cls_1': '0.034334', 'loss_loc_1': '0.114750', 'loss_cls_2': '0.015423', 'loss_loc_2': '0.069755', 'loss_rpn_cls': '0.017566', 'loss_rpn_bbox': '0.035430', 'loss': '0.475777', time: 2.256, eta: 5 days, 16:06:33\n",
      "2020-06-13 10:53:06,330-INFO: iter: 53000, lr: 0.000250, 'loss_cls_0': '0.081962', 'loss_loc_0': '0.086148', 'loss_cls_1': '0.033850', 'loss_loc_1': '0.110982', 'loss_cls_2': '0.014812', 'loss_loc_2': '0.067988', 'loss_rpn_cls': '0.018060', 'loss_rpn_bbox': '0.033130', 'loss': '0.454961', time: 2.252, eta: 5 days, 15:46:16\n",
      "2020-06-13 11:00:49,879-INFO: iter: 53200, lr: 0.000250, 'loss_cls_0': '0.080190', 'loss_loc_0': '0.085821', 'loss_cls_1': '0.031951', 'loss_loc_1': '0.105283', 'loss_cls_2': '0.014931', 'loss_loc_2': '0.065576', 'loss_rpn_cls': '0.018373', 'loss_rpn_bbox': '0.034666', 'loss': '0.441779', time: 2.314, eta: 5 days, 19:21:57\n",
      "2020-06-13 11:08:50,477-INFO: iter: 53400, lr: 0.000250, 'loss_cls_0': '0.079586', 'loss_loc_0': '0.086695', 'loss_cls_1': '0.032207', 'loss_loc_1': '0.109984', 'loss_cls_2': '0.014422', 'loss_loc_2': '0.067813', 'loss_rpn_cls': '0.018834', 'loss_rpn_bbox': '0.035892', 'loss': '0.455827', time: 2.399, eta: 6 days, 0:19:12\n",
      "2020-06-13 11:16:39,928-INFO: iter: 53600, lr: 0.000250, 'loss_cls_0': '0.081093', 'loss_loc_0': '0.088275', 'loss_cls_1': '0.032226', 'loss_loc_1': '0.107627', 'loss_cls_2': '0.015031', 'loss_loc_2': '0.065728', 'loss_rpn_cls': '0.018222', 'loss_rpn_bbox': '0.033172', 'loss': '0.448461', time: 2.355, eta: 5 days, 21:34:23\n",
      "2020-06-13 11:24:47,356-INFO: iter: 53800, lr: 0.000250, 'loss_cls_0': '0.081122', 'loss_loc_0': '0.086959', 'loss_cls_1': '0.033146', 'loss_loc_1': '0.113405', 'loss_cls_2': '0.015127', 'loss_loc_2': '0.070943', 'loss_rpn_cls': '0.018933', 'loss_rpn_bbox': '0.032713', 'loss': '0.454846', time: 2.418, eta: 6 days, 1:14:03\n",
      "2020-06-13 11:32:47,822-INFO: iter: 54000, lr: 0.000250, 'loss_cls_0': '0.078892', 'loss_loc_0': '0.088322', 'loss_cls_1': '0.031303', 'loss_loc_1': '0.110280', 'loss_cls_2': '0.014343', 'loss_loc_2': '0.069797', 'loss_rpn_cls': '0.018753', 'loss_rpn_bbox': '0.035295', 'loss': '0.453960', time: 2.413, eta: 6 days, 0:48:31\n",
      "2020-06-13 11:40:47,862-INFO: iter: 54200, lr: 0.000250, 'loss_cls_0': '0.079202', 'loss_loc_0': '0.085996', 'loss_cls_1': '0.031681', 'loss_loc_1': '0.104056', 'loss_cls_2': '0.014526', 'loss_loc_2': '0.066005', 'loss_rpn_cls': '0.016921', 'loss_rpn_bbox': '0.034297', 'loss': '0.442178', time: 2.406, eta: 6 days, 0:12:00\n",
      "2020-06-13 11:48:45,855-INFO: iter: 54400, lr: 0.000250, 'loss_cls_0': '0.077876', 'loss_loc_0': '0.086696', 'loss_cls_1': '0.032544', 'loss_loc_1': '0.111035', 'loss_cls_2': '0.014845', 'loss_loc_2': '0.067932', 'loss_rpn_cls': '0.018568', 'loss_rpn_bbox': '0.035783', 'loss': '0.460566', time: 2.392, eta: 5 days, 23:15:38\n",
      "2020-06-13 11:56:15,284-INFO: iter: 54600, lr: 0.000250, 'loss_cls_0': '0.075893', 'loss_loc_0': '0.083073', 'loss_cls_1': '0.030594', 'loss_loc_1': '0.104048', 'loss_cls_2': '0.014068', 'loss_loc_2': '0.063890', 'loss_rpn_cls': '0.017916', 'loss_rpn_bbox': '0.032918', 'loss': '0.434840', time: 2.240, eta: 5 days, 14:02:38\n",
      "2020-06-13 12:03:49,421-INFO: iter: 54800, lr: 0.000250, 'loss_cls_0': '0.077799', 'loss_loc_0': '0.084560', 'loss_cls_1': '0.031492', 'loss_loc_1': '0.105583', 'loss_cls_2': '0.014294', 'loss_loc_2': '0.064408', 'loss_rpn_cls': '0.016887', 'loss_rpn_bbox': '0.035272', 'loss': '0.434660', time: 2.268, eta: 5 days, 15:34:11\n",
      "2020-06-13 12:11:34,067-INFO: iter: 55000, lr: 0.000250, 'loss_cls_0': '0.074819', 'loss_loc_0': '0.080475', 'loss_cls_1': '0.029287', 'loss_loc_1': '0.099552', 'loss_cls_2': '0.013232', 'loss_loc_2': '0.061682', 'loss_rpn_cls': '0.017544', 'loss_rpn_bbox': '0.032343', 'loss': '0.420811', time: 2.329, eta: 5 days, 19:06:21\n",
      "2020-06-13 12:19:18,420-INFO: iter: 55200, lr: 0.000250, 'loss_cls_0': '0.075415', 'loss_loc_0': '0.082757', 'loss_cls_1': '0.030405', 'loss_loc_1': '0.101293', 'loss_cls_2': '0.013872', 'loss_loc_2': '0.062993', 'loss_rpn_cls': '0.018185', 'loss_rpn_bbox': '0.036116', 'loss': '0.429633', time: 2.325, eta: 5 days, 18:44:33\n",
      "2020-06-13 12:26:53,677-INFO: iter: 55400, lr: 0.000250, 'loss_cls_0': '0.075724', 'loss_loc_0': '0.081716', 'loss_cls_1': '0.030841', 'loss_loc_1': '0.103418', 'loss_cls_2': '0.013766', 'loss_loc_2': '0.062639', 'loss_rpn_cls': '0.017369', 'loss_rpn_bbox': '0.033777', 'loss': '0.429115', time: 2.276, eta: 5 days, 15:42:12\n",
      "2020-06-13 12:34:30,541-INFO: iter: 55600, lr: 0.000250, 'loss_cls_0': '0.080782', 'loss_loc_0': '0.086786', 'loss_cls_1': '0.032330', 'loss_loc_1': '0.111597', 'loss_cls_2': '0.014310', 'loss_loc_2': '0.068342', 'loss_rpn_cls': '0.017592', 'loss_rpn_bbox': '0.032579', 'loss': '0.463172', time: 2.284, eta: 5 days, 16:02:08\n",
      "2020-06-13 12:42:13,339-INFO: iter: 55800, lr: 0.000250, 'loss_cls_0': '0.079488', 'loss_loc_0': '0.088295', 'loss_cls_1': '0.032718', 'loss_loc_1': '0.109415', 'loss_cls_2': '0.014710', 'loss_loc_2': '0.066449', 'loss_rpn_cls': '0.017525', 'loss_rpn_bbox': '0.034670', 'loss': '0.460644', time: 2.314, eta: 5 days, 17:41:39\n",
      "2020-06-13 12:49:42,235-INFO: iter: 56000, lr: 0.000250, 'loss_cls_0': '0.080445', 'loss_loc_0': '0.084581', 'loss_cls_1': '0.033321', 'loss_loc_1': '0.108757', 'loss_cls_2': '0.014956', 'loss_loc_2': '0.068389', 'loss_rpn_cls': '0.018856', 'loss_rpn_bbox': '0.033263', 'loss': '0.452054', time: 2.242, eta: 5 days, 13:16:33\n",
      "2020-06-13 12:57:08,972-INFO: iter: 56200, lr: 0.000250, 'loss_cls_0': '0.076029', 'loss_loc_0': '0.080783', 'loss_cls_1': '0.029448', 'loss_loc_1': '0.100706', 'loss_cls_2': '0.013014', 'loss_loc_2': '0.062898', 'loss_rpn_cls': '0.016973', 'loss_rpn_bbox': '0.031997', 'loss': '0.419644', time: 2.235, eta: 5 days, 12:42:26\n",
      "2020-06-13 13:04:41,109-INFO: iter: 56400, lr: 0.000250, 'loss_cls_0': '0.077225', 'loss_loc_0': '0.083826', 'loss_cls_1': '0.031384', 'loss_loc_1': '0.103213', 'loss_cls_2': '0.014140', 'loss_loc_2': '0.064329', 'loss_rpn_cls': '0.016557', 'loss_rpn_bbox': '0.035783', 'loss': '0.438628', time: 2.259, eta: 5 days, 14:03:04\n",
      "2020-06-13 13:12:15,291-INFO: iter: 56600, lr: 0.000250, 'loss_cls_0': '0.077448', 'loss_loc_0': '0.083961', 'loss_cls_1': '0.030229', 'loss_loc_1': '0.107305', 'loss_cls_2': '0.014009', 'loss_loc_2': '0.066875', 'loss_rpn_cls': '0.018268', 'loss_rpn_bbox': '0.033556', 'loss': '0.438197', time: 2.274, eta: 5 days, 14:46:54\n",
      "2020-06-13 13:19:41,304-INFO: iter: 56800, lr: 0.000250, 'loss_cls_0': '0.078449', 'loss_loc_0': '0.083381', 'loss_cls_1': '0.030978', 'loss_loc_1': '0.106888', 'loss_cls_2': '0.014000', 'loss_loc_2': '0.068640', 'loss_rpn_cls': '0.018153', 'loss_rpn_bbox': '0.033415', 'loss': '0.444051', time: 2.220, eta: 5 days, 11:27:05\n",
      "2020-06-13 13:27:12,808-INFO: iter: 57000, lr: 0.000250, 'loss_cls_0': '0.078101', 'loss_loc_0': '0.085013', 'loss_cls_1': '0.031989', 'loss_loc_1': '0.108496', 'loss_cls_2': '0.014352', 'loss_loc_2': '0.067900', 'loss_rpn_cls': '0.018115', 'loss_rpn_bbox': '0.032231', 'loss': '0.448447', time: 2.260, eta: 5 days, 13:43:30\n",
      "2020-06-13 13:34:30,576-INFO: iter: 57200, lr: 0.000250, 'loss_cls_0': '0.079001', 'loss_loc_0': '0.085149', 'loss_cls_1': '0.033395', 'loss_loc_1': '0.102691', 'loss_cls_2': '0.014385', 'loss_loc_2': '0.062060', 'loss_rpn_cls': '0.017036', 'loss_rpn_bbox': '0.033491', 'loss': '0.432414', time: 2.195, eta: 5 days, 9:45:58\n",
      "2020-06-13 13:41:58,211-INFO: iter: 57400, lr: 0.000250, 'loss_cls_0': '0.077873', 'loss_loc_0': '0.082990', 'loss_cls_1': '0.029888', 'loss_loc_1': '0.104958', 'loss_cls_2': '0.013178', 'loss_loc_2': '0.064369', 'loss_rpn_cls': '0.016905', 'loss_rpn_bbox': '0.032691', 'loss': '0.432287', time: 2.240, eta: 5 days, 12:15:29\n",
      "2020-06-13 13:49:21,974-INFO: iter: 57600, lr: 0.000250, 'loss_cls_0': '0.079032', 'loss_loc_0': '0.084930', 'loss_cls_1': '0.031496', 'loss_loc_1': '0.109911', 'loss_cls_2': '0.014052', 'loss_loc_2': '0.068557', 'loss_rpn_cls': '0.017085', 'loss_rpn_bbox': '0.034919', 'loss': '0.445450', time: 2.216, eta: 5 days, 10:44:45\n",
      "2020-06-13 13:56:44,997-INFO: iter: 57800, lr: 0.000250, 'loss_cls_0': '0.078158', 'loss_loc_0': '0.087201', 'loss_cls_1': '0.032317', 'loss_loc_1': '0.112153', 'loss_cls_2': '0.015266', 'loss_loc_2': '0.070761', 'loss_rpn_cls': '0.017851', 'loss_rpn_bbox': '0.032861', 'loss': '0.455072', time: 2.213, eta: 5 days, 10:26:37\n",
      "2020-06-13 14:04:27,583-INFO: iter: 58000, lr: 0.000250, 'loss_cls_0': '0.081931', 'loss_loc_0': '0.086661', 'loss_cls_1': '0.032426', 'loss_loc_1': '0.107777', 'loss_cls_2': '0.014498', 'loss_loc_2': '0.067455', 'loss_rpn_cls': '0.018640', 'loss_rpn_bbox': '0.034109', 'loss': '0.455495', time: 2.318, eta: 5 days, 16:29:08\n",
      "2020-06-13 14:12:06,139-INFO: iter: 58200, lr: 0.000250, 'loss_cls_0': '0.078668', 'loss_loc_0': '0.083875', 'loss_cls_1': '0.032852', 'loss_loc_1': '0.110798', 'loss_cls_2': '0.014384', 'loss_loc_2': '0.070174', 'loss_rpn_cls': '0.015858', 'loss_rpn_bbox': '0.032632', 'loss': '0.449927', time: 2.293, eta: 5 days, 14:54:07\n",
      "2020-06-13 14:19:42,558-INFO: iter: 58400, lr: 0.000250, 'loss_cls_0': '0.079432', 'loss_loc_0': '0.086880', 'loss_cls_1': '0.032088', 'loss_loc_1': '0.113019', 'loss_cls_2': '0.014736', 'loss_loc_2': '0.070196', 'loss_rpn_cls': '0.019375', 'loss_rpn_bbox': '0.034092', 'loss': '0.457627', time: 2.282, eta: 5 days, 14:07:40\n",
      "2020-06-13 14:27:10,068-INFO: iter: 58600, lr: 0.000250, 'loss_cls_0': '0.075395', 'loss_loc_0': '0.081969', 'loss_cls_1': '0.029250', 'loss_loc_1': '0.103294', 'loss_cls_2': '0.013281', 'loss_loc_2': '0.068161', 'loss_rpn_cls': '0.015912', 'loss_rpn_bbox': '0.031324', 'loss': '0.423831', time: 2.232, eta: 5 days, 11:03:14\n",
      "2020-06-13 14:34:49,029-INFO: iter: 58800, lr: 0.000250, 'loss_cls_0': '0.072471', 'loss_loc_0': '0.081165', 'loss_cls_1': '0.027344', 'loss_loc_1': '0.096557', 'loss_cls_2': '0.011876', 'loss_loc_2': '0.060891', 'loss_rpn_cls': '0.018396', 'loss_rpn_bbox': '0.033805', 'loss': '0.409417', time: 2.293, eta: 5 days, 14:30:58\n",
      "2020-06-13 14:42:37,021-INFO: iter: 59000, lr: 0.000250, 'loss_cls_0': '0.074086', 'loss_loc_0': '0.079415', 'loss_cls_1': '0.029230', 'loss_loc_1': '0.099307', 'loss_cls_2': '0.013229', 'loss_loc_2': '0.061941', 'loss_rpn_cls': '0.017887', 'loss_rpn_bbox': '0.032355', 'loss': '0.414014', time: 2.340, eta: 5 days, 17:08:38\n",
      "2020-06-13 14:50:12,285-INFO: iter: 59200, lr: 0.000250, 'loss_cls_0': '0.077338', 'loss_loc_0': '0.082768', 'loss_cls_1': '0.030966', 'loss_loc_1': '0.103678', 'loss_cls_2': '0.013398', 'loss_loc_2': '0.062975', 'loss_rpn_cls': '0.017058', 'loss_rpn_bbox': '0.033034', 'loss': '0.435645', time: 2.284, eta: 5 days, 13:45:39\n",
      "2020-06-13 14:57:44,130-INFO: iter: 59400, lr: 0.000250, 'loss_cls_0': '0.074630', 'loss_loc_0': '0.082126', 'loss_cls_1': '0.029657', 'loss_loc_1': '0.101311', 'loss_cls_2': '0.012878', 'loss_loc_2': '0.063725', 'loss_rpn_cls': '0.016560', 'loss_rpn_bbox': '0.031164', 'loss': '0.421057', time: 2.255, eta: 5 days, 11:54:04\n",
      "2020-06-13 15:05:06,155-INFO: iter: 59600, lr: 0.000250, 'loss_cls_0': '0.072448', 'loss_loc_0': '0.080082', 'loss_cls_1': '0.029979', 'loss_loc_1': '0.100467', 'loss_cls_2': '0.013625', 'loss_loc_2': '0.063558', 'loss_rpn_cls': '0.016701', 'loss_rpn_bbox': '0.032454', 'loss': '0.415373', time: 2.215, eta: 5 days, 9:25:33\n",
      "2020-06-13 15:12:35,090-INFO: iter: 59800, lr: 0.000250, 'loss_cls_0': '0.078131', 'loss_loc_0': '0.082950', 'loss_cls_1': '0.030801', 'loss_loc_1': '0.106393', 'loss_cls_2': '0.013733', 'loss_loc_2': '0.066037', 'loss_rpn_cls': '0.018140', 'loss_rpn_bbox': '0.033747', 'loss': '0.441588', time: 2.238, eta: 5 days, 10:41:13\n",
      "2020-06-13 15:20:00,801-INFO: iter: 60000, lr: 0.000250, 'loss_cls_0': '0.073203', 'loss_loc_0': '0.079312', 'loss_cls_1': '0.029562', 'loss_loc_1': '0.103318', 'loss_cls_2': '0.012657', 'loss_loc_2': '0.066948', 'loss_rpn_cls': '0.018128', 'loss_rpn_bbox': '0.034117', 'loss': '0.422317', time: 2.235, eta: 5 days, 10:22:21\n",
      "2020-06-13 15:20:00,803-INFO: Save model to output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/60000.\n",
      "2020-06-13 15:20:04,360-INFO: Test iter 0\n",
      "2020-06-13 15:20:12,344-INFO: Test iter 100\n",
      "2020-06-13 15:20:20,205-INFO: Test iter 200\n",
      "2020-06-13 15:20:28,276-INFO: Test iter 300\n",
      "2020-06-13 15:20:36,050-INFO: Test iter 400\n",
      "2020-06-13 15:20:42,593-INFO: Test finish iter 484\n",
      "2020-06-13 15:20:42,594-INFO: Total number of images: 484, inference time: 12.641915869912319 fps.\n",
      "2020-06-13 15:20:42,645-INFO: Start evaluate...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.01s)\n",
      "creating index...\n",
      "index created!\n",
      "Loading and preparing results...\n",
      "DONE (t=0.01s)\n",
      "creating index...\n",
      "index created!\n",
      "Running per image evaluation...\n",
      "Evaluate annotation type *bbox*\n",
      "DONE (t=0.63s).\n",
      "Accumulating evaluation results...\n",
      "DONE (t=0.27s).\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.214\n",
      " Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.425\n",
      " Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.184\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.135\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.174\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.230\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.278\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.335\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.335\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.219\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.293\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.325\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 15:20:43,584-INFO: Save model to output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/best_model.\n",
      "2020-06-13 15:20:47,109-INFO: Best test box ap: 0.21437536926493966, in iter: 60000\n",
      "2020-06-13 15:27:24,443-INFO: iter: 60200, lr: 0.000250, 'loss_cls_0': '0.072641', 'loss_loc_0': '0.082910', 'loss_cls_1': '0.028229', 'loss_loc_1': '0.104382', 'loss_cls_2': '0.012597', 'loss_loc_2': '0.065579', 'loss_rpn_cls': '0.016248', 'loss_rpn_bbox': '0.032092', 'loss': '0.426294', time: 2.217, eta: 5 days, 9:10:25\n",
      "2020-06-13 15:34:56,623-INFO: iter: 60400, lr: 0.000250, 'loss_cls_0': '0.076547', 'loss_loc_0': '0.081140', 'loss_cls_1': '0.029971', 'loss_loc_1': '0.104700', 'loss_cls_2': '0.013376', 'loss_loc_2': '0.065353', 'loss_rpn_cls': '0.016671', 'loss_rpn_bbox': '0.033824', 'loss': '0.424367', time: 2.263, eta: 5 days, 11:44:43\n",
      "2020-06-13 15:42:25,866-INFO: iter: 60600, lr: 0.000250, 'loss_cls_0': '0.074039', 'loss_loc_0': '0.081764', 'loss_cls_1': '0.029647', 'loss_loc_1': '0.106219', 'loss_cls_2': '0.013604', 'loss_loc_2': '0.067317', 'loss_rpn_cls': '0.017288', 'loss_rpn_bbox': '0.031707', 'loss': '0.433272', time: 2.246, eta: 5 days, 10:39:07\n",
      "2020-06-13 15:49:49,393-INFO: iter: 60800, lr: 0.000250, 'loss_cls_0': '0.078303', 'loss_loc_0': '0.084312', 'loss_cls_1': '0.032008', 'loss_loc_1': '0.107818', 'loss_cls_2': '0.014467', 'loss_loc_2': '0.066916', 'loss_rpn_cls': '0.018316', 'loss_rpn_bbox': '0.033401', 'loss': '0.440466', time: 2.211, eta: 5 days, 8:30:43\n",
      "2020-06-13 15:57:11,013-INFO: iter: 61000, lr: 0.000250, 'loss_cls_0': '0.076660', 'loss_loc_0': '0.081139', 'loss_cls_1': '0.030152', 'loss_loc_1': '0.099994', 'loss_cls_2': '0.013518', 'loss_loc_2': '0.065178', 'loss_rpn_cls': '0.017822', 'loss_rpn_bbox': '0.033144', 'loss': '0.425402', time: 2.214, eta: 5 days, 8:32:26\n",
      "2020-06-13 16:04:34,794-INFO: iter: 61200, lr: 0.000250, 'loss_cls_0': '0.076113', 'loss_loc_0': '0.082528', 'loss_cls_1': '0.029955', 'loss_loc_1': '0.104299', 'loss_cls_2': '0.013592', 'loss_loc_2': '0.065345', 'loss_rpn_cls': '0.015945', 'loss_rpn_bbox': '0.031379', 'loss': '0.424958', time: 2.219, eta: 5 days, 8:40:58\n",
      "2020-06-13 16:12:02,081-INFO: iter: 61400, lr: 0.000250, 'loss_cls_0': '0.075561', 'loss_loc_0': '0.080457', 'loss_cls_1': '0.029605', 'loss_loc_1': '0.102772', 'loss_cls_2': '0.013496', 'loss_loc_2': '0.067600', 'loss_rpn_cls': '0.018429', 'loss_rpn_bbox': '0.033595', 'loss': '0.428031', time: 2.227, eta: 5 days, 9:01:42\n",
      "2020-06-13 16:19:27,076-INFO: iter: 61600, lr: 0.000250, 'loss_cls_0': '0.076752', 'loss_loc_0': '0.080098', 'loss_cls_1': '0.030365', 'loss_loc_1': '0.103327', 'loss_cls_2': '0.013701', 'loss_loc_2': '0.064491', 'loss_rpn_cls': '0.017506', 'loss_rpn_bbox': '0.032148', 'loss': '0.416472', time: 2.242, eta: 5 days, 9:45:36\n",
      "2020-06-13 16:26:54,911-INFO: iter: 61800, lr: 0.000250, 'loss_cls_0': '0.072785', 'loss_loc_0': '0.081035', 'loss_cls_1': '0.029549', 'loss_loc_1': '0.103009', 'loss_cls_2': '0.013247', 'loss_loc_2': '0.064805', 'loss_rpn_cls': '0.016450', 'loss_rpn_bbox': '0.032613', 'loss': '0.418337', time: 2.230, eta: 5 days, 8:57:41\n",
      "2020-06-13 16:34:21,648-INFO: iter: 62000, lr: 0.000250, 'loss_cls_0': '0.076287', 'loss_loc_0': '0.080033', 'loss_cls_1': '0.030252', 'loss_loc_1': '0.100817', 'loss_cls_2': '0.012921', 'loss_loc_2': '0.065873', 'loss_rpn_cls': '0.017377', 'loss_rpn_bbox': '0.031746', 'loss': '0.427011', time: 2.233, eta: 5 days, 8:59:42\n",
      "2020-06-13 16:41:45,214-INFO: iter: 62200, lr: 0.000250, 'loss_cls_0': '0.076067', 'loss_loc_0': '0.086632', 'loss_cls_1': '0.029735', 'loss_loc_1': '0.105734', 'loss_cls_2': '0.013542', 'loss_loc_2': '0.069066', 'loss_rpn_cls': '0.018430', 'loss_rpn_bbox': '0.032657', 'loss': '0.447360', time: 2.222, eta: 5 days, 8:14:33\n",
      "2020-06-13 16:46:20,591-INFO: KeyboardInterrupt: main proc 6288 exit, kill subprocess []\n"
     ]
    }
   ],
   "source": [
    "# 训练时间比较长，这里演示到60000多轮\n",
    "%run tools/train.py -c configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml --eval"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 评估预测\n",
    "**和一般的Cascade RCNN模型比，增强后的预测速度那是立竿见影的快～**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 17:00:40,993-INFO: places would be ommited when DataLoader is not iterable\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.01s)\n",
      "creating index...\n",
      "index created!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 17:00:42,809-INFO: Test iter 0\n",
      "2020-06-13 17:00:50,053-INFO: Test iter 100\n",
      "2020-06-13 17:00:57,316-INFO: Test iter 200\n",
      "2020-06-13 17:01:04,496-INFO: Test iter 300\n",
      "2020-06-13 17:01:11,709-INFO: Test iter 400\n",
      "2020-06-13 17:01:17,723-INFO: Test finish iter 484\n",
      "2020-06-13 17:01:17,725-INFO: Total number of images: 484, inference time: 13.746567331612598 fps.\n",
      "2020-06-13 17:01:17,773-INFO: Start evaluate...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.01s)\n",
      "creating index...\n",
      "index created!\n",
      "Loading and preparing results...\n",
      "DONE (t=0.14s)\n",
      "creating index...\n",
      "index created!\n",
      "Running per image evaluation...\n",
      "Evaluate annotation type *bbox*\n",
      "DONE (t=0.41s).\n",
      "Accumulating evaluation results...\n",
      "DONE (t=0.18s).\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.214\n",
      " Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.425\n",
      " Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.184\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.135\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.174\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.230\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.278\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.335\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.335\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.219\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.293\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.325\n"
     ]
    }
   ],
   "source": [
    "# 训练时间比较长，这里演示到60000多轮\n",
    "%run tools/eval.py -c configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 17:45:31,376-INFO: Load categories from /home/aistudio/PaddleDetection/dataset/coco/annotations/instances_val2017.json\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.00s)\n",
      "creating index...\n",
      "index created!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 17:45:31,807-INFO: Infer iter 0\n",
      "2020-06-13 17:45:31,857-INFO: Detection bbox results save in output/9a49f25c5d9b6e390840112792.jpg\n"
     ]
    }
   ],
   "source": [
    "%run tools/infer.py -c configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml \\\n",
    "                         -o weights=output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/60000 \\\n",
    "                         --infer_img=/home/aistudio/PaddleDetection/dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "预测效果：\n",
    "![file](https://ai-studio-static-online.cdn.bcebos.com/1e017b19272547848e22eab831bce9f6218d8c1465f94436b681140fdb3923b8)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 预测部署\n",
    "\n",
    "`PaddleDetection`目前支持使用`Python`和`C++`部署在`Windows` 和`Linux` 上运行。\n",
    "\n",
    "### 模型导出\n",
    "训练得到一个满足要求的模型后，如果想要将该模型接入到C++服务器端预测库或移动端预测库，需要通过`tools/export_model.py`导出该模型。\n",
    "\n",
    "模型导出后, 目录结构如下:\n",
    "```\n",
    "cascade_rcnn_dcn_r50_vd_fpn_3x_server_side # 模型目录\n",
    "├── infer_cfg.yml # 模型配置信息\n",
    "├── __model__     # 模型文件\n",
    "└── __params__    # 参数文件\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 17:43:17,614-INFO: save_inference_model pruned unused feed variables im_id\n",
      "2020-06-13 17:43:17,615-INFO: Export inference model to ./inference_model/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side, input: ['image', 'im_info', 'im_shape'], output: ['multiclass_nms_0.tmp_0']...\n",
      "2020-06-13 17:43:18,413-INFO: Load categories from /home/aistudio/PaddleDetection/dataset/coco/annotations/instances_val2017.json\n",
      "2020-06-13 17:43:18,424-INFO: Export inference config file to ./inference_model/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/infer_cfg.yml\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.01s)\n",
      "creating index...\n",
      "index created!\n"
     ]
    }
   ],
   "source": [
    "%run tools/export_model.py -c configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml \\\n",
    "        --output_dir=./inference_model \\\n",
    "        -o weights=output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/60000"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### Python端预测部署\n",
    "（节选自官方文档）\n",
    "\n",
    "使用AnalysisPredictor对导出模型进行高性能预测。\n",
    "\n",
    "在PaddlePaddle中预测引擎和训练引擎底层有着不同的优化方法, 下面列出了两种不同的预测方式。Executor同时支持训练和预测，AnalysisPredictor则专门针对推理进行了优化，是基于C++预测库的Python接口，该引擎可以对模型进行多项图优化，减少不必要的内存拷贝。\n",
    "\n",
    "- Executor：[Executor](https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/basic_concept/executor.html#executor)\n",
    "- AnalysisPredictor：[AnalysisPredictor](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/python_infer_cn.html#analysispredictor)\n",
    "\n",
    "\n",
    "主要包含两个步骤：\n",
    "\n",
    "- 导出预测模型\n",
    "- 基于Python的预测\n",
    "\n",
    "```bash\n",
    "python deploy/python/infer.py --model_dir=/path/to/models --image_file=/path/to/image\n",
    "--use_gpu=(False/True)\n",
    "```\n",
    "\n",
    "参数说明如下:\n",
    "\n",
    "| 参数 | 是否必须|含义 |\n",
    "|-------|-------|----------|\n",
    "| --model_dir | Yes|上述导出的模型路径 |\n",
    "| --image_file | Yes |需要预测的图片 |\n",
    "| --video_file | Yes |需要预测的视频 |\n",
    "| --use_gpu |No|是否GPU，默认为False|\n",
    "| --run_mode |No|使用GPU时，默认为fluid, 可选（fluid/trt_fp32/trt_fp16）|\n",
    "| --threshold |No|预测得分的阈值，默认为0.5|\n",
    "| --output_dir |No|可视化结果保存的根目录，默认为output/|\n",
    "| --run_benchmark |No|是否运行benchmark，同时需指定--image_file|\n",
    "\n",
    "说明：\n",
    "\n",
    "- run_mode：fluid代表使用AnalysisPredictor，精度float32来推理，其他参数指用AnalysisPredictor，TensorRT不同精度来推理。\n",
    "- PaddlePaddle默认的GPU安装包(<=1.7)，不支持基于TensorRT进行预测，如果想基于TensorRT加速预测，需要自行编译，详细可参考[预测库编译教程](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_usage/deploy/inference/paddle_tensorrt_infer.html)。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----------  Running Arguments -----------\n",
      "image_file: /home/aistudio/PaddleDetection/dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg\n",
      "model_dir: inference_model/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side\n",
      "output_dir: output\n",
      "run_benchmark: False\n",
      "run_mode: fluid\n",
      "threshold: 0.1\n",
      "use_gpu: True\n",
      "video_file: \n",
      "------------------------------------------\n",
      "-----------  Model Configuration -----------\n",
      "Model Arch: RCNN\n",
      "Use Padddle Executor: False\n",
      "Transform Order: \n",
      "--transform op: Normalize\n",
      "--transform op: Resize\n",
      "--transform op: Permute\n",
      "--transform op: PadStride\n",
      "--------------------------------------------\n",
      "Inference: 58.06612968444824 ms per batch image\n",
      "class_id:5, confidence:0.96,left_top:[0.00,402.01], right_bottom:[2437.63,773.60]\n",
      "save result to: output/9a49f25c5d9b6e390840112792.jpg\n"
     ]
    }
   ],
   "source": [
    "%run deploy/python/infer.py --model_dir=inference_model/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side \\\n",
    "--image_file=/home/aistudio/PaddleDetection/dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg \\\n",
    "--use_gpu=(True) \\\n",
    "--threshold=0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### PaddleServing部署\n",
    "#### 环境安装\n",
    "到终端执行\n",
    "```bash\n",
    "wget https://paddle-serving.bj.bcebos.com/aistudio/cuda-9.0-aistudio-env.tar.gz \n",
    "tar xf cuda-9.0-aistudio-env.tar.gz\n",
    "cd work && \\\n",
    "wget https://paddle-serving.bj.bcebos.com/whl/paddle_serving_app-0.1.0-py3-none-any.whl && \\\n",
    "wget https://paddle-serving.bj.bcebos.com/whl/paddle_serving_client-0.3.0-cp37-none-manylinux1_x86_64.whl && \\\n",
    "wget https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.3.0-py3-none-any.whl \n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "!pip install -U ../paddle_serving_app-0.1.0-py3-none-any.whl  ../paddle_serving_client-0.3.0-cp37-none-manylinux1_x86_64.whl  ../paddle_serving_server_gpu-0.3.0-py3-none-any.whl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 18:33:20,070-INFO: save_inference_model pruned unused feed variables im_id\n",
      "2020-06-13 18:33:20,071-INFO: Export serving model to /home/aistudio, client side: /home/aistudio/serving_client, server side: /home/aistudio/serving_server. input: ['image', 'im_info', 'im_shape'], output: ['multiclass_nms_0.tmp_0']...\n",
      "2020-06-13 18:33:21,122-INFO: Load categories from /home/aistudio/PaddleDetection/dataset/coco/annotations/instances_val2017.json\n",
      "2020-06-13 18:33:21,133-INFO: Export inference config file to /home/aistudio/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/infer_cfg.yml\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.01s)\n",
      "creating index...\n",
      "index created!\n"
     ]
    }
   ],
   "source": [
    "# 导出在PaddleServing部署的模型，客户端和服务端会安装到/home/aistudio/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side目录下\n",
    "%run tools/export_serving_model.py -c configs/rcnn_enhance/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side.yml \\\n",
    "        --output_dir=/home/aistudio \\\n",
    "        -o weights=output/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/60000"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "#### RPC部署\n",
    "控制台进入/home/aistudio/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side目录下启动\n",
    "```bash\n",
    "LD_LIBRARY_PATH=/home/aistudio/env/cuda-9.0/lib64:$LD_LIBRARY_PATH && python -m paddle_serving_server_gpu.serve --thread 10 --model serving_server --port 9292 --gpu_id 0\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/aistudio/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side\n"
     ]
    }
   ],
   "source": [
    "%cd /home/aistudio/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'multiclass_nms_0.tmp_0': array([[5.0000000e+00, 9.7122425e-01, 0.0000000e+00, 2.4466286e+02,\n",
      "        1.4897058e+03, 4.7303064e+02]], dtype=float32), 'image': '/home/aistudio/PaddleDetection/dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg'}\n"
     ]
    }
   ],
   "source": [
    "from paddle_serving_client import Client\n",
    "from paddle_serving_app.reader import *\n",
    "import numpy as np\n",
    "\n",
    "preprocess = Sequential([\n",
    "    File2Image(), BGR2RGB(), Div(255.0),\n",
    "    Normalize([0.37, 0.36, 0.36], [0.11, 0.10, 0.10], False),\n",
    "    Resize(1000, 1500), Transpose((2, 0, 1)), PadStride(32)\n",
    "])\n",
    "client = Client()\n",
    "client.load_client_config(\"serving_client/serving_client_conf.prototxt\")\n",
    "client.connect(['127.0.0.1:9292'])\n",
    "im = preprocess('/home/aistudio/PaddleDetection/dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg')\n",
    "fetch_map = client.predict(feed={\"image\": im, \"im_info\": np.array(list(im.shape[1:]) + [1.0]),\n",
    "                                 \"im_shape\": np.array(list(im.shape[1:]) + [1.0])}, fetch=[\"multiclass_nms_0.tmp_0\"])\n",
    "fetch_map[\"image\"] = '/home/aistudio/PaddleDetection/dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg'\n",
    "print (fetch_map)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### PaddleLite部署"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting paddlelite\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ff/87/ee8681a32543b5a780f3828210063703f936949e8b39ec0bab95d86433c0/paddlelite-2.6.1-cp37-cp37m-manylinux1_x86_64.whl (42.7MB)\n",
      "\u001b[K     |████████████████████████████████| 42.7MB 647kB/s eta 0:00:01     |████████████▌                   | 16.6MB 356kB/s eta 0:01:14\n",
      "\u001b[?25hInstalling collected packages: paddlelite\n",
      "Successfully installed paddlelite-2.6.1\n"
     ]
    }
   ],
   "source": [
    "!pip install paddlelite"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "#### 转化模型为Paddle-Lite格式\n",
    "opt可以将PaddlePaddle的部署模型格式转化为Paddle-Lite 支持的模型格式，期间执行的操作包括：\n",
    "\n",
    "- 将protobuf格式的模型文件转化为naive_buffer格式的模型文件，有效降低模型体积\n",
    "- 执行“量化、子图融合、混合调度、Kernel优选”等图优化操作，提升其在Paddle-Lite上的运行速度、内存占用等效果\n",
    "\n",
    "模型优化过程：\n",
    "\n",
    "（1）准备待优化的PaddlePaddle模型\n",
    "\n",
    "PaddlePaddle模型有两种保存格式：\n",
    "- Combined Param：所有参数信息保存在单个文件`params`中，模型的拓扑信息保存在`__model__`文件中。\n",
    "- Seperated Param：参数信息分开保存在多个参数文件中，模型的拓扑信息保存在`__model__`文件中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OPs in the input model include:\r\n",
      "                                        OP_name      Host       X86      CUDA       ARM    OpenCL      FPGA       NPU       XPU     RKNPU       APU       Any       Unk\r\n",
      "                                     batch_norm                   Y                   Y                                                                                \r\n",
      "                                         concat                   Y         Y         Y         Y                                                                      \r\n",
      "                                         conv2d                   Y         Y         Y         Y         Y                                                            \r\n",
      "                                deformable_conv                                elementwise_add                   Y         Y         Y         Y         Y                                                            \r\n",
      "                                           feed         Y                   Y                             Y                                                            \r\n",
      "                                          fetch         Y                                                 Y                                                            \r\n",
      "                                     leaky_relu                   Y         Y         Y         Y                                                                      \r\n",
      "                                 multiclass_nms         Y                                                 Y                                                            \r\n",
      "                                 nearest_interp                             Y         Y         Y                                                                      \r\n",
      "                                         pool2d                   Y         Y         Y         Y         Y                                                            \r\n",
      "                                           relu                   Y         Y         Y         Y                                                                      \r\n",
      "                                        sigmoid                                       Y         Y                                                                      \r\n",
      "                                          split                                       Y                                                                                \r\n",
      "                                     transpose2                   Y         Y         Y                                                                                \r\n",
      "                                       yolo_box                             Y         Y                                                                                \r\n",
      "WARNING: Logging before InitGoogleLogging() is written to STDERR\r\n",
      "E0705 10:12:13.862241   145 opt_base.cc:445] Error: This model is not supported, because 1 ops are not supported on 'arm,npu'. These unsupported ops are: 'deformable_conv'.\r\n"
     ]
    }
   ],
   "source": [
    "!paddle_lite_opt --print_model_ops=true  --model_dir=../../PaddleDetection/inference_model/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco --valid_targets=npu,arm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING: Logging before InitGoogleLogging() is written to STDERR\r\n",
      "E0705 10:18:05.926549   153 opt_base.cc:445] Error: This model is not supported, because 26 ops are not supported on 'npu'. These unsupported ops are: 'anchor_generator, batch_norm, box_clip, box_coder, collect_fpn_proposals, concat, conv2d, deformable_conv, distribute_fpn_proposals, elementwise_add, elementwise_div, expand, gather, generate_proposals, lod_reset, mul, nearest_interp, pool2d, relu, roi_align, scale, sequence_expand, sigmoid, slice, softmax, split'.\r\n"
     ]
    }
   ],
   "source": [
    "# work/PaddleDetection/inference_model/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side目录下的文件是 Combined Param形式\n",
    "!paddle_lite_opt \\\n",
    "    --model_file=inference_model/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/__model__ \\\n",
    "    --param_file=inference_model/cascade_rcnn_dcn_r50_vd_fpn_3x_server_side/__params__ \\\n",
    "    --optimize_out_type=naive_buffer \\\n",
    "    --optimize_out=paddle_lite_opt \\\n",
    "    --valid_targets=npu"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 使用YOLOv3增强模型训练\n",
    "\n",
    "摘自[PaddleDetection文档](https://gitee.com/paddlepaddle/PaddleDetection/blob/master/docs/featured_model/YOLOv3_ENHANCEMENT.md)\n",
    "\n",
    "---\n",
    "\n",
    "## 简介\n",
    "PaddleDetection实现版本中使用了 [Bag of Freebies for Training Object Detection Neural Networks](https://arxiv.org/abs/1902.04103v3) 中提出的图像增强和label smooth等优化方法，精度优于darknet框架的实现版本，在COCO-2017数据集上，YOLOv3(DarkNet)达到`mAP(0.50:0.95)= 38.9`的精度，比darknet实现版本的精度(33.0)要高5.9。同时，在推断速度方面，基于Paddle预测库的加速方法，推断速度比darknet高30%。\n",
    "\n",
    "## 方法描述\n",
    "\n",
    "1.将[YOLOv3](https://arxiv.org/pdf/1804.02767.pdf)骨架网络更换为[ResNet50-VD](https://arxiv.org/pdf/1812.01187.pdf)。ResNet50-VD网络相比原生的DarkNet53网络在速度和精度上都有一定的优势，且相较DarkNet53 ResNet系列更容易扩展，针对自己业务场景可以选择ResNet18、34、101等不同结构作为检测模型的主干网络。\n",
    "\n",
    "2.引入[Deformable Convolution v2](https://arxiv.org/abs/1811.11168)(可变形卷积)替代原始卷积操作，Deformable Convolution已经在多个视觉任务中广泛验证过其效果，在Yolo v3增强模型中考虑到速度与精度的平衡，我们仅使用Deformable Convolution替换了主干网络中Stage5部分的3x3卷积。\n",
    "\n",
    "3.在FPN部分增加[DropBlock](https://arxiv.org/abs/1810.12890)模块，提高模型泛化能力。Dropout操作如下图（b）中所示是分类网络中广泛使用的增强模型泛化能力的重要手段之一。DropBlock算法相比于Dropout算法，在Drop特征的时候会集中Drop掉某一块区域，更适应于在检测任务中提高网络泛化能力。\n",
    "\n",
    "4.Yolo v3作为一阶段检测网络，在定位精度上相比Faster RCNN，Cascade RCNN等网络结构有着其天然的劣势，增加[IoU Loss](https://arxiv.org/abs/1908.03851)分支，可以一定程度上提高BBox定位精度，缩小一阶段和两阶段检测网络的差距。\n",
    "\n",
    "5.增加[IoU Aware](https://arxiv.org/abs/1912.05992)分支，预测输出BBox和真实BBox的IoU，修正用于NMS的评分，可进一步提高YOLOV3的预测性能。\n",
    "\n",
    "6.使用[Object365数据集](https://www.objects365.org/download.html)训练得到的模型作为coco数据集上的预训练模型，Object365数据集包含约60万张图片以及365种类别，相比coco数据集进行预训练可以进一步提高YOLOv3的精度。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 修改以下文件中的分类数\n",
    "- PaddleDetection/configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml.yml\n",
    "- PaddleDetection/ppdet/modeling/anchor_heads/yolo_head.py\n",
    "- PaddleDetection/ppdet/data/reader.py\n",
    "- PaddleDetection/ppdet/data/transform/batch_operators.py\n",
    "> 注意：如果训练时打印的分类数仍然没有改过来，需要重启一下环境\n",
    "\n",
    "参考配置文件\n",
    "- `/home/aistudio/PaddleDetection/configs/dcn/yolov3_enhance_reader.yml`\n",
    "```YAML\n",
    "TrainReader:\n",
    "  inputs_def:\n",
    "    fields: ['image', 'gt_bbox', 'gt_class', 'gt_score']\n",
    "    num_max_boxes: 50\n",
    "  use_fine_grained_loss: true\n",
    "  dataset:\n",
    "    !COCODataSet\n",
    "    image_dir: train2017\n",
    "    anno_path: annotations/instances_train2017.json\n",
    "    dataset_dir: dataset/coco\n",
    "    with_background: false\n",
    "  sample_transforms:\n",
    "    - !DecodeImage\n",
    "      to_rgb: True\n",
    "    - !RandomCrop {}\n",
    "    - !RandomFlipImage\n",
    "      is_normalized: false\n",
    "    - !NormalizeBox {}\n",
    "    - !PadBox\n",
    "      num_max_boxes: 50\n",
    "    - !BboxXYXY2XYWH {}\n",
    "  batch_transforms:\n",
    "    - !RandomShape\n",
    "      sizes: [320, 352, 384, 416, 448, 480, 512, 544, 576, 608]\n",
    "      random_inter: True\n",
    "    - !NormalizeImage\n",
    "      mean: [0.37597409304695484, 0.3486304254014788, 0.3536799056211826] \n",
    "      std: [0.1048299549268863, 0.10444091185913326, 0.09987538234260904]\n",
    "      is_scale: False\n",
    "      is_channel_first: false\n",
    "    - !Permute\n",
    "      to_bgr: false\n",
    "      channel_first: True\n",
    "    # Gt2YoloTarget is only used when use_fine_grained_loss set as true,\n",
    "    # this operator will be deleted automatically if use_fine_grained_loss\n",
    "    # is set as false\n",
    "    - !Gt2YoloTarget\n",
    "      anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]]\n",
    "      anchors: [[36, 297], [5, 94], [5, 15],\n",
    "                [9, 594], [45, 20], [4, 38],\n",
    "                [8, 31], [13, 12], [570, 141]]\n",
    "      downsample_ratios: [32, 16, 8]\n",
    "  batch_size: 8\n",
    "  shuffle: true\n",
    "  drop_last: true\n",
    "  worker_num: 8\n",
    "  bufsize: 16\n",
    "  use_process: true\n",
    "\n",
    "EvalReader:\n",
    "  inputs_def:\n",
    "    image_shape: [3, 608, 608]\n",
    "    fields: ['image', 'im_size', 'im_id']\n",
    "    num_max_boxes: 50\n",
    "  dataset:\n",
    "    !COCODataSet\n",
    "    dataset_dir: dataset/coco\n",
    "    anno_path: annotations/instances_val2017.json\n",
    "    image_dir: val2017\n",
    "    with_background: false\n",
    "  sample_transforms:\n",
    "    - !DecodeImage\n",
    "      to_rgb: True\n",
    "      with_mixup: false\n",
    "    - !ResizeImage\n",
    "      interp: 2\n",
    "      target_size: 608\n",
    "    - !NormalizeImage\n",
    "      mean: [0.3914940814114446, 0.3605475730949753, 0.36263685530651174]\n",
    "      std: [0.11077973580477549, 0.10994100883809227, 0.10480770290045718]\n",
    "      is_scale: False\n",
    "      is_channel_first: false\n",
    "    - !PadBox\n",
    "      num_max_boxes: 50\n",
    "    - !Permute\n",
    "      to_bgr: false\n",
    "      channel_first: True\n",
    "  batch_size: 8\n",
    "  drop_empty: false\n",
    "  worker_num: 8\n",
    "  bufsize: 16\n",
    "\n",
    "TestReader:\n",
    "  inputs_def:\n",
    "    image_shape: [3, 608, 608]\n",
    "    fields: ['image', 'im_size', 'im_id']\n",
    "  dataset:\n",
    "    !ImageFolder\n",
    "      anno_path: annotations/instances_val2017.json\n",
    "      with_background: false\n",
    "  sample_transforms:\n",
    "    - !DecodeImage\n",
    "      to_rgb: True\n",
    "      with_mixup: false\n",
    "    - !ResizeImage\n",
    "      interp: 2\n",
    "      target_size: 608\n",
    "    - !NormalizeImage\n",
    "      mean: [0.3914940814114446, 0.3605475730949753, 0.36263685530651174]\n",
    "      std: [0.11077973580477549, 0.10994100883809227, 0.10480770290045718]\n",
    "      is_scale: False\n",
    "      is_channel_first: false\n",
    "    - !Permute\n",
    "      to_bgr: false\n",
    "      channel_first: True\n",
    "  batch_size: 1\n",
    "```\n",
    "- `/home/aistudio/PaddleDetection/configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml`\n",
    "```YAML\n",
    "architecture: YOLOv3\n",
    "use_gpu: true\n",
    "max_iters: 85000\n",
    "log_smooth_window: 20\n",
    "save_dir: output\n",
    "snapshot_iter: 10000\n",
    "metric: COCO\n",
    "pretrain_weights: https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar\n",
    "weights: output/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco/model_final\n",
    "num_classes: 20\n",
    "finetune_exclude_pretrained_params: ['yolo_output']\n",
    "use_fine_grained_loss: true\n",
    "\n",
    "YOLOv3:\n",
    "  backbone: ResNet\n",
    "  yolo_head: YOLOv3Head\n",
    "  use_fine_grained_loss: true\n",
    "\n",
    "ResNet:\n",
    "  norm_type: sync_bn\n",
    "  freeze_at: 0\n",
    "  freeze_norm: false\n",
    "  norm_decay: 0.\n",
    "  depth: 50\n",
    "  feature_maps: [3, 4, 5]\n",
    "  variant: d\n",
    "  dcn_v2_stages: [5]\n",
    "\n",
    "YOLOv3Head:\n",
    "  anchor_masks: [[6, 7, 8], [3, 4, 5], [0, 1, 2]]\n",
    "  anchors: [[36, 297], [5, 94], [5, 15],\n",
    "            [9, 594], [45, 20], [4, 38],\n",
    "            [8, 31], [13, 12], [570, 141]]\n",
    "  norm_decay: 0.\n",
    "  yolo_loss: YOLOv3Loss\n",
    "  nms:\n",
    "    background_label: -1\n",
    "    keep_top_k: 50\n",
    "    nms_threshold: 0.45\n",
    "    nms_top_k: 500\n",
    "    normalized: false\n",
    "    score_threshold: 0.01\n",
    "  drop_block: true\n",
    "\n",
    "YOLOv3Loss:\n",
    "  # batch_size here is only used for fine grained loss, not used\n",
    "  # for training batch_size setting, training batch_size setting\n",
    "  # is in configs/yolov3_reader.yml TrainReader.batch_size, batch\n",
    "  # size here should be set as same value as TrainReader.batch_size\n",
    "  batch_size: 8\n",
    "  ignore_thresh: 0.7\n",
    "  label_smooth: false\n",
    "  use_fine_grained_loss: true\n",
    "  iou_loss: IouLoss\n",
    "\n",
    "IouLoss:\n",
    "  loss_weight: 2.5\n",
    "  max_height: 608\n",
    "  max_width: 608\n",
    "\n",
    "LearningRate:\n",
    "  base_lr: 0.000125\n",
    "  schedulers:\n",
    "  - !PiecewiseDecay\n",
    "    gamma: 0.1\n",
    "    milestones:\n",
    "    - 55000\n",
    "    - 75000\n",
    "  - !LinearWarmup\n",
    "    start_factor: 0.\n",
    "    steps: 4000\n",
    "\n",
    "OptimizerBuilder:\n",
    "  optimizer:\n",
    "    momentum: 0.9\n",
    "    type: Momentum\n",
    "  regularizer:\n",
    "    factor: 0.0005\n",
    "    type: L2\n",
    "\n",
    "_READER_: 'yolov3_enhance_reader.yml'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/aistudio/PaddleDetection\n"
     ]
    }
   ],
   "source": [
    "%cd /home/aistudio/PaddleDetection/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%run tools/train.py -c configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml \n",
    "                    --eval"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 模型评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-08 01:25:50,575-INFO: 484 samples in file dataset/coco/annotations/instances_val2017.json\n",
      "2020-06-08 01:25:50,577-INFO: places would be ommited when DataLoader is not iterable\n",
      "2020-06-08 01:25:50,578-INFO: In json_eval mode, PaddleDetection will evaluate json files in output_eval directly. And proposal.json, bbox.json and mask.json will be detected by default.\n",
      "2020-06-08 01:25:50,578-INFO: ./proposal.json not exists!\n",
      "2020-06-08 01:25:50,584-INFO: Start evaluate...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loading annotations into memory...\n",
      "Done (t=0.00s)\n",
      "creating index...\n",
      "index created!\n",
      "loading annotations into memory...\n",
      "Done (t=0.00s)\n",
      "creating index...\n",
      "index created!\n",
      "Loading and preparing results...\n",
      "DONE (t=0.01s)\n",
      "creating index...\n",
      "index created!\n",
      "Running per image evaluation...\n",
      "Evaluate annotation type *bbox*\n",
      "DONE (t=0.79s).\n",
      "Accumulating evaluation results...\n",
      "DONE (t=0.19s).\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.178\n",
      " Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.445\n",
      " Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.113\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.155\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.185\n",
      " Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.189\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.219\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.287\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.288\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.255\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.265\n",
      " Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.314\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-08 01:25:51,601-INFO: ./mask.json not exists!\n"
     ]
    }
   ],
   "source": [
    "%run tools/eval.py -c configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml \\\n",
    "           --json_eval \\\n",
    "           --output_eval ./"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 模型推断及可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 21:58:12,536-INFO: Loading parameters from output/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco/model_final...\n",
      "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py:1973: UserWarning: This list is not set, Because of Paramerter not found in program. There are: create_parameter_0.w_0 create_parameter_1.w_0 create_parameter_2.w_0 create_parameter_3.w_0 create_parameter_4.w_0 create_parameter_5.w_0 create_parameter_6.w_0 create_parameter_7.w_0 create_parameter_8.w_0 create_parameter_9.w_0 create_parameter_10.w_0 create_parameter_11.w_0 create_parameter_12.w_0 create_parameter_13.w_0 create_parameter_14.w_0 create_parameter_15.w_0 create_parameter_16.w_0 create_parameter_17.w_0 create_parameter_18.w_0 create_parameter_19.w_0 create_parameter_20.w_0 create_parameter_21.w_0 create_parameter_22.w_0 create_parameter_23.w_0\n",
      "  format(\" \".join(unused_para_list)))\n",
      "2020-06-13 21:58:14,684-INFO: Not found annotation file annotations/instances_val2017.json, load coco17 categories.\n",
      "2020-06-13 21:58:14,942-INFO: Infer iter 0\n",
      "2020-06-13 21:58:14,992-INFO: Detection bbox results save in infer_output/9a49f25c5d9b6e390840112792.jpg\n"
     ]
    }
   ],
   "source": [
    "%run tools/infer.py -c configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml \\\r\n",
    "                    --infer_img=dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg \\\r\n",
    "                    --output_dir=infer_output/ \\\r\n",
    "                    --draw_threshold=0.5                "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "预测效果\n",
    "![file](https://ai-studio-static-online.cdn.bcebos.com/87b714e94ebd48bd9935f2e7d834404051559f16ad4f4d6d92269df8713db7fa)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 模型导出\n",
    "训练得到一个满足要求的模型后，如果想要将该模型接入到C++预测库或者Serving服务，需要通过tools/export_model.py导出该模型。\n",
    "[参考链接](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.2/docs/advanced_tutorials/inference/EXPORT_MODEL.md)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 22:03:47,121-INFO: Loading parameters from output/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco/model_final...\n",
      "2020-06-13 22:03:49,080-INFO: save_inference_model pruned unused feed variables im_id\n",
      "2020-06-13 22:03:49,081-INFO: Export inference model to ./inference_model/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco, input: ['image', 'im_size'], output: ['multiclass_nms_0.tmp_0']...\n"
     ]
    }
   ],
   "source": [
    "# 导出YOLOv3模型\r\n",
    "%run tools/export_model.py -c configs/dcn/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco.yml \\\r\n",
    "        --output_dir=./inference_model \\\r\n",
    "        -o weights=output/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco/model_final"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## Python API预测\n",
    "使用Python API对[导出模型](EXPORT_MODEL.md)保存的inference_model进行预测。\n",
    "\n",
    "在PaddlePaddle中预测引擎和训练引擎底层有着不同的优化方法，代码走不同的分支，两者都可以进行预测。在入门教程的训练/评估/预测流程中介绍的预测流程，即tools/infer.py是使用训练引擎分支的预测流程。保存的inference_model，可以通过`fluid.io.load_inference_model`接口，走训练引擎分支预测。本文档也同时介绍通过预测引擎的Python API进行预测，一般而言这种方式的速度优于前者。\n",
    "\n",
    "Python API预测示例，除了可视化部分依赖PaddleDetection外，预处理、模型结构、执行流程均不依赖PaddleDetection。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-06-13 22:40:11,429-INFO: The architecture is YOLO\n",
      "2020-06-13 22:40:11,430-INFO: Extra info: im_size\n",
      "2020-06-13 22:40:11,648-INFO: warmup...\n",
      "2020-06-13 22:40:12,398-INFO: run benchmark...\n",
      "2020-06-13 22:40:18,209-INFO: Not found annotation file None, load coco17 categories.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Inference: 58.089587688446045 ms per batch image\n"
     ]
    }
   ],
   "source": [
    "%run tools/cpp_infer.py --model_path=inference_model/yolov3_r50vd_dcn_db_iouloss_obj365_pretrained_coco/ \\\n",
    "--config_path=tools/cpp_demo.yml --infer_img=dataset/coco/val2017/9a49f25c5d9b6e390840112792.jpg --visualize"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 小结\n",
    "\n",
    "- 基于PaddleClas中SSLD蒸馏方案训练得到的ResNet50_vd预训练模型(ImageNet1k验证集上Top1 Acc为82.39%)，结合PaddleDetection中的丰富算子，面向服务器端实用的目标检测方案PSS-DET(Practical Server Side Detection)，使CascadeRCNN增强模型在预测速度上逼近YOLOv3增强模型，效果非常显著\n",
    "- 工业质检场景，小目标检测是一大难题，对于小目标来说，当进行卷积池化到最后一层，实际上语义信息已经没有了，在本文中，YOLOv3增强模型在小目标检测上效果相对更好些\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 后续开发计划\n",
    "- 增加带花纹的布匹瑕疵数据（复赛数据集）继续完善模型\n",
    "- 开发后置分类矫正模块\n",
    "- [迁移到PaddleX，降低学习成本](https://aistudio.baidu.com/aistudio/projectdetail/618168)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PaddlePaddle 1.7.0 (Python 3.5)",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
